FIFO 的控制逻辑---verilog代码

 //fifo的例化
wire fifo_full;
wire fifo_empty;
wire [ : ] fifo_dout;
wire [:]rd_data_count;
wire [:]wr_data_count; fifo_generator_0 U1 (
.rst(reset_fifo),
.wr_clk(rx_usrclk), // input wire wr_clk
.rd_clk(tx_usrclk_1), // input wire rd_clk
.din(din), // input wire [9 : 0] din
.wr_en(wr_en), // input wire wr_en
.rd_en(rd_en), // input wire rd_en
.dout(fifo_dout), // output wire [9 : 0] dout
.full(fifo_full), // output wire full
.empty(fifo_empty), // output wire empty
.rd_data_count(rd_data_count), // output wire [9 : 0] rd_data_count
.wr_data_count(wr_data_count) // output wire [9 : 0] wr_data_count
); //fifo的复位方式,通过vio核手动复位
wire reset_fifo;
vio_2 U2 (
.clk(clk_27M), // input wire clk
.probe_out0(reset_fifo) // output wire [0 : 0] probe_out0
); //*****************************************************************************
//1.fifo写操作的控制
//2.fifo刚开始工作时,先写满一半,然后fifo读操作才开始
//3.fifo达到full状态时,写操作停止,读操作继续,当检测到fifo里面的数据还剩下一
//半时,写操作再次开始工作
//4.fifo达到empty状态时,读操作停止,还需要等待read_start信号的到来才能再次启动
//读操作,即fifo从空的状态写到了一半
//***************************************************************************** reg [:]i;
reg read_start;
reg wr_en_r;
reg [:]din_r; always@(posedge rx_usrclk)
begin
if(reset_fifo)
begin
i <= 'd0;
read_start <= 'b0;
wr_en_r <= 'b0;
din_r <= 'd0;
end
else
begin
case(i)
'd0:
begin
if(!fifo_full)
begin
wr_en_r <= 'b1;
i<=i+'b1;
end
else
wr_en_r <= 'b0;
end 'd1:
begin
if(fifo_full)
begin
wr_en_r <= 'b0;
i<=i+'b1;
end
else if(fifo_empty)
read_start <= 'b0;
else
begin
din_r <= rx_ds1a;
if(wr_data_count >='d16384)
read_start <= 'b1;
end
end 'd2:
begin
if(wr_data_count <='d16384)
begin
wr_en_r <= 'b1;
i<='d1;
end
end default:
begin
wr_en_r <= 'b0;
read_start <='b0;
end
endcase
end
end wire [:]din;
wire wr_en;
wire [:]i_w;
wire read_start_w; assign wr_en = rx_ce ? wr_en_r : 'b0;
assign din = din_r;
assign i_w = i;
assign read_start_w = read_start; reg rd_en_r;
reg [:]j; always@(posedge tx_usrclk_1)
begin
if(reset_fifo)
begin
rd_en_r <= 'b0;
j <= 'd0;
end
else
begin
case(j)
'd0:
begin
if(read_start && !fifo_empty)
begin
rd_en_r <= 'b1;
j<=j+'b1;
end
else
rd_en_r <= 'b0;
end 'd1:
begin
if(fifo_empty)
begin
rd_en_r <= 'b0;
j<='d0;
end
end default:
begin
rd_en_r <= 'b0;
j <= 'd0;
end
endcase
end
end wire rd_en;
wire [:]j_w; assign j_w = j;
assign rd_en = tx_ce[] ? rd_en_r : 'b0;

备注:分两个always块(因为fifo的读和写在不同的时钟域),对fifo的读写操作进行控制。

FIFO 的控制逻辑---verilog代码的更多相关文章

  1. 分享:FIFO 同步、异步以及Verilog代码实现

    FIFO 很重要,之前参加的各类电子公司的逻辑设计的笔试几乎都会考到. FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线 ...

  2. Verilog代码规范I

    Verilog代码规范I "规范"这问题 "规范"这个富含专业气息的词汇(个人感觉),其实规范这种东西,就是大家都约定熟成的东西,一旦你不遵守这个东西,专业人士 ...

  3. 时钟分频方法---verilog代码

    时钟分频方法---verilog代码 本文以SDI播出部分的工程为例,来说明一种时钟分频的写法.SD-SDI工程中播出时钟tx_usrclk为148.5MHz,但tx_video_a_y_in端的数据 ...

  4. Verilog代码和FPGA硬件的映射关系(一)

    代码和硬件之间的映射关系是一个很奇妙的过程,也展现出人类的智慧.单片机内部的硬件结构都是固定的,无法改变,我们通过代码操作着寄存器的读写,来执行各种复杂的任务.FPGA的硬件结构并不像单片机一样是固定 ...

  5. 学会使用Hdlbits网页版Verilog代码仿真验证平台

    给大家推荐一款网页版的 Verilog代码编辑仿真验证平台,这个平台是国外的一家开源FPGA学习网站,通过“https://hdlbits.01xz.net/wiki/Main_Page” 地址链接进 ...

  6. Verilog代码和FPGA硬件的映射关系(三)

    组合逻辑和FPGA之间的映射关系我们知道了,那时序逻辑和FPGA之间又是一种怎样的映射关系呢?我们就以前面寄存器章节的例子来向大家说明,也一同把当时为什么用异步复位更节约资源的原因告诉大家.我们先来看 ...

  7. Verilog代码和FPGA硬件的映射关系(二)

    大家可能会有这样的疑问,我们编写的Verilog代码最终会在FPGA上以怎样的映射关系来实现功能呢?我们以一个最简单的组合逻辑与门为例来向大家说明.RTL代码如下所示: //------------- ...

  8. HD,3G视频数据中行号的插入方法---Verilog代码实现

    HD,3G视频数据中行号的插入方法---Verilog代码实现 行号的生成: `timescale 1ns / 1ps //////////////////////////////////////// ...

  9. 串口接收端verilog代码分析

    串口接收端verilog代码分析 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////// ...

随机推荐

  1. 普通new和placement new的重载

    对于自定义对象,我们可以重载普通new操作符,这时候使用new Test()时就会调用到我们重载的普通new操作符. 示例程序: #include <iostream> #include ...

  2. 爬格子问题(经典强化学习问题) Sarsa 与 Q-Learning 的区别

    SARSA v.s. Q-learning 爬格子问题,是典型的经典强化学习问题. 动作是上下左右的走,每走一步就会有一个-1的奖赏.从初始状态走到最终的状态,要走最短的路才能使奖赏最大.图中有一个悬 ...

  3. Ubuntu 12.04不能在華碩F81se系列電腦上安裝解决辦法

    本人華碩F81se系列的電腦,剛開始是裝的ubuntu 10.04的系統,周末閑的無聊,就想把系統換成ubuntu 12.04的,從ubuntu官網上下載了12.04的安裝包,下了個usb insta ...

  4. Python中的print、input函数以及Python中交换两个变量解析

    一.Python中的值交换操作 首先明确一点点,Python中的一切都是面向对象的,可以理解为Python的中一切都是对象. 我们知道Java也是面向对象的语言,但是在Java中定义一个值变量如下: ...

  5. Linux 修改最大连接数脚本

    #!/bin/bashfileMax=$(grep "fs.file-max" /etc/sysctl.conf | wc -l)if [ $fileMax -eq 1 ];the ...

  6. select标签(下拉菜单和列表)

    下拉菜单和列表标签: <select> <option value="..." >选项</option> <option value=&q ...

  7. 第8次Scrum会议(10/20)【欢迎来怼】

    一.小组信息 队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华 小组照片 二.开会信息 时间:2017/10/20 17:20~17:45,总计25min. 地点 ...

  8. Damped Track 阻尼跟随

    Damped Track 阻尼跟随 https://www.youtube.com/watch?v=pd1od5WPCUw 2个网格及对应的2个空对象Z轴方向网格:{O.up}; 上方园孔把手中间放空 ...

  9. (9)SQL的注入(致命的漏洞)

    用户登陆网站的时候进行账户验证输入特殊的格式和字符会触发一个漏洞,不需要密码直接登录成功 import pymysql username = input('请输入账号: ')password = in ...

  10. Redis 5.0.0 releases notes

    Redis 5.0 release notes ======================= ---------------------------------------------------- ...