FIFO 的控制逻辑---verilog代码
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代码的更多相关文章
- 分享:FIFO 同步、异步以及Verilog代码实现
FIFO 很重要,之前参加的各类电子公司的逻辑设计的笔试几乎都会考到. FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线 ...
- Verilog代码规范I
Verilog代码规范I "规范"这问题 "规范"这个富含专业气息的词汇(个人感觉),其实规范这种东西,就是大家都约定熟成的东西,一旦你不遵守这个东西,专业人士 ...
- 时钟分频方法---verilog代码
时钟分频方法---verilog代码 本文以SDI播出部分的工程为例,来说明一种时钟分频的写法.SD-SDI工程中播出时钟tx_usrclk为148.5MHz,但tx_video_a_y_in端的数据 ...
- Verilog代码和FPGA硬件的映射关系(一)
代码和硬件之间的映射关系是一个很奇妙的过程,也展现出人类的智慧.单片机内部的硬件结构都是固定的,无法改变,我们通过代码操作着寄存器的读写,来执行各种复杂的任务.FPGA的硬件结构并不像单片机一样是固定 ...
- 学会使用Hdlbits网页版Verilog代码仿真验证平台
给大家推荐一款网页版的 Verilog代码编辑仿真验证平台,这个平台是国外的一家开源FPGA学习网站,通过“https://hdlbits.01xz.net/wiki/Main_Page” 地址链接进 ...
- Verilog代码和FPGA硬件的映射关系(三)
组合逻辑和FPGA之间的映射关系我们知道了,那时序逻辑和FPGA之间又是一种怎样的映射关系呢?我们就以前面寄存器章节的例子来向大家说明,也一同把当时为什么用异步复位更节约资源的原因告诉大家.我们先来看 ...
- Verilog代码和FPGA硬件的映射关系(二)
大家可能会有这样的疑问,我们编写的Verilog代码最终会在FPGA上以怎样的映射关系来实现功能呢?我们以一个最简单的组合逻辑与门为例来向大家说明.RTL代码如下所示: //------------- ...
- HD,3G视频数据中行号的插入方法---Verilog代码实现
HD,3G视频数据中行号的插入方法---Verilog代码实现 行号的生成: `timescale 1ns / 1ps //////////////////////////////////////// ...
- 串口接收端verilog代码分析
串口接收端verilog代码分析 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////// ...
随机推荐
- ES6 函数的扩展-rest参数
ES6 引入 rest 参数(形式为...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了.rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中. functio ...
- JAVA的设计模式之装饰设计模式
1.装饰设计模式 顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: 2.看这个图可能不容易理解,举两个 ...
- 【Eigen开源库】linux系统如何安装使用Eigen库
code /* * File : haedPose.cpp * Coder: * Date : 20181126 * Refer: https://www.learnopencv.com/head-p ...
- np.tile语法
>>> v = np.array([1, 0, 1])>>> vv = np.tile(v,(4,1))>>> print vv[[1 0 1] ...
- Unity 3D UGUI Toggle用法教程
UGUI Toggle用法教程 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...
- 对于vs出现“This function or variable may be unsafe”
1.项目上右击选择“属性” 2.选择C/C++ ->预处理器 ->预处理器定义 3.添加一行 _CRT_SECURE_NO_WARNINGS 4.点击确定,重新编译成功.
- 测试那些事儿—BUG
一.作为测试人员,你应该这样报BUG: 不要对程序员说,你的代码有BUG. 他的第一反应是:1.你的环境有问题吧:2.你踏马到底会不会用? 如果你委婉的说:你这个程序和预期的不一样,你看看是不是我的方 ...
- react写单选按钮或table标签
首先,原理是一样的: class Loca_choose_wrap extends Component{ constructor(){ super(); this.state={ port_name: ...
- xdoj 1146 (逆向01背包)
背包 有:01背包 逆向背包 多重背包 完全背包 所有的背包都可以根据更新的方向一维实现 amazing?! #include <iostream> #include <cstd ...
- ZOJ 1002:Fire Net(DFS+回溯)
Fire Net Time Limit: 2 Seconds Memory Limit: 65536 KB Suppose that we have a square city with s ...