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. ES6 函数的扩展-rest参数

    ES6 引入 rest 参数(形式为...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了.rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中. functio ...

  2. JAVA的设计模式之装饰设计模式

    1.装饰设计模式 顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: 2.看这个图可能不容易理解,举两个 ...

  3. 【Eigen开源库】linux系统如何安装使用Eigen库

    code /* * File : haedPose.cpp * Coder: * Date : 20181126 * Refer: https://www.learnopencv.com/head-p ...

  4. np.tile语法

    >>> v = np.array([1, 0, 1])>>> vv = np.tile(v,(4,1))>>> print vv[[1 0 1] ...

  5. Unity 3D UGUI Toggle用法教程

    UGUI Toggle用法教程 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

  6. 对于vs出现“This function or variable may be unsafe”

    1.项目上右击选择“属性” 2.选择C/C++ ->预处理器 ->预处理器定义 3.添加一行  _CRT_SECURE_NO_WARNINGS 4.点击确定,重新编译成功.

  7. 测试那些事儿—BUG

    一.作为测试人员,你应该这样报BUG: 不要对程序员说,你的代码有BUG. 他的第一反应是:1.你的环境有问题吧:2.你踏马到底会不会用? 如果你委婉的说:你这个程序和预期的不一样,你看看是不是我的方 ...

  8. react写单选按钮或table标签

    首先,原理是一样的: class Loca_choose_wrap extends Component{ constructor(){ super(); this.state={ port_name: ...

  9. xdoj 1146 (逆向01背包)

    背包 有:01背包 逆向背包  多重背包 完全背包  所有的背包都可以根据更新的方向一维实现 amazing?! #include <iostream> #include <cstd ...

  10. ZOJ 1002:Fire Net(DFS+回溯)

    Fire Net Time Limit: 2 Seconds      Memory Limit: 65536 KB Suppose that we have a square city with s ...