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. Linux shell脚本中shift

    Linux shell脚本中shift的用法说明 shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本). ...

  2. Spring Boot 揭秘与实战(八) 发布与部署 - 开发热部署

    文章目录 1. spring-boot-devtools 实现热部署 2. Spring Loaded 实现热部署 3. 模板文件热部署 4. 源代码 Spring Boot 支持页面与类文件的热部署 ...

  3. Java 经典面试题 —— 性能

    1. 性能 String.StringBuffer 与 StringBuilder 两个字符串相加,str1+str2,相当于执行: StringBuilder strBuilder1 = new S ...

  4. 九度OJ1049题-去特定字符(和1111题特别像)

    题目1049:字符串去特定字符 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:11329 解决:5169 题目描述: 输入字符串s和字符c,要求去掉s中所有的c字符,并输出结果. 输入: ...

  5. this语句的用法第一、二点

    1.this是js的一个关键字,指定一个对象然后去代替他. 函数内的this和函数外的this,函数内的this指向行为发生的主体.函数外的this都指向window没有意思. 例题: functio ...

  6. C++学习(二十九)(C语言部分)之 顺序表

    一.数据结构组织 存放数据的方式 精心选择的数据结构可以提升效率 数据结构 1.逻辑结构 一对多关系 父与子 一对一关系 排队中 多对多关系 两地的路线 2.存储结构 数据存放的位置关系 顺序存储数据 ...

  7. linux----CenterOS7中在线安装jdk

    summary: 一直以来,都在windows上玩java,今天是一个具有里程碑的一天,感觉正式踏入进入了linux大门. 原来一直以为在linux上安装jdk,需要去官网下载适合linux的jdk, ...

  8. centos7配置lamp成功安装过

    linux+apache+mysql/mariadb+php 首先apache的安装: yum install httpd 接着mysql/mariadb的安装: yum install mysql ...

  9. lsusb

    1.lsusb查看系统的USB设备 $ lsusb Bus Device : ID : Kingston Technology Bus Device : ID 1d6b: Linux Foundati ...

  10. x的奇幻之旅 (史蒂夫·斯托加茨 著)

    第1部分 数字 第1章 数学:从企鹅的"鱼"订单到无穷大 (已看) 第2章 一组组石头与加减乘除运算 (已看) 第3章 "敌人的敌人就是朋友“与"负负得正&qu ...