在利用FPGA进行数据缓存或者数据位宽和速率的变换中,FIFO是一个使用简单,实现容易的IP核。在实际的使用中遇到一点注意事项
测试过程:向FIFO中传入8位,输出为2位,采用同一个时钟,写使能用testbench中手动拉高,每次持续8个时钟周期,读使能条件为非空,得到的仿真结果如图3所示:
图3 仿真结果
从图中的结果可以看出,在写入第一个字节后,empty信号就会拉低为低电平,然后可以开始读数据;此时写使能信号是延迟复位信号6个时钟周期;
然后更改写使能信号,在复位后一个周期拉高,得到的实验结果为图4与图3的实验结果一致:
图4. 仿真结果
2. 模式2:
图5 配置
其他保持不变
读写时钟选择同一个时钟,写使能和读使能保持不变,然后再testbanch中让din_en信号在复位信号为高时,经过24个时钟周期后拉高使能信号,持续八个时钟周期;得到的结果如图6所示:
图6.仿真结果
提前拉高din_en信号,得到的结果图7
图7.仿真结果
继续提前这个信号得到仿真结果如图8所示
图8. 仿真结果
通过实验表明,在选择读写独立时钟进行工作时,虽然选择同一个时钟信号输入到读写时钟接口,在写入数据是需要给fifo复位之后一个处理时间,在此时间写入的数据会丢失,测试的结果是,复位之后15个时钟周期之后开始工作。
对于对模式2结果的分析,传入数据为何会在6个时钟周期后,empty才会拉低,查看应用手册PG057,
图9. 芯片手册
这里指出empty信号的latency计算公式,其中因为模式选择N=2,wr_clk(写时钟) = clk, rd_clk(读时钟) =clk, 所以这个latency的结果为6clk。
针对第二个问题,在复位信号后15个工作周期后才可以工作,
图10.reset时序图
是有关于复位的时钟的,包括同步复位和异步复位,这个在PG057的127页开始,单独介绍复位的时钟操作,
如下为使用的测试代码,
module fifotest(
input rst_n,
input clk,
input din,
output dout,
input din_en);
//生成八位数据和采样时钟
wire [7:0]fifo_din;
reg[7:0] fifo_da_temp;
wire [1:0] fifo1_dout;
always@(posedge clk)begin
if(!rst_n)begin
fifo_da_temp <= 8'b0;
end
else begin
fifo_da_temp <= 8'd66;
end
end
//定义一个分频时钟
localparam clk_cnt = 8'd9;
reg [7:0]cnt; //用于分频计数
always@(posedge clk)begin
if(!rst_n)begin
cnt <= 8'd0;
end
else begin
if(cnt >= clk_cnt)begin
cnt <= 8'd0;
end
else begin
cnt <= cnt + 8'd1;
end
end
end
reg clk_plus; //分频时钟
always@(posedge clk)begin
if(!rst_n)begin
clk_plus <= 1'b0;
end
else begin
if(cnt >= clk_cnt)begin
clk_plus <= 1'b1;
end
else begin
clk_plus <= 1'b0;
end
end
end
//输入进入fifo的信号
assign fifo_din = {
fifo_da_temp[6],fifo_da_temp[7],fifo_da_temp[4],fifo_da_temp[5],fifo_da_temp[2],fifo_da_temp[3],fifo_da_temp[0],fifo_da_temp[1]};
wire empty_fifo8to2;
//fifo输入8to2
fifo_8to2 u0 (
.rst(!rst_n), // input wire rst
.wr_clk(clk), // input wire wr_clk
.rd_clk(clk), // input wire rd_clk
.din(fifo_din), // input wire [7 : 0] din
.wr_en(din_en), // input wire wr_en
.rd_en((!empty_fifo8to2) & 1'b1), // input wire rd_en
.dout(fifo1_dout), // output wire [1 : 0] dout
.full(), // output wire full
.empty(empty_fifo8to2) // output wire empty
);
//fifo_8to2 u1 (
// .clk(clk), // input wire clk
// .srst(!rst_n), // input wire srst
// .din(fifo_din), // input wire [7 : 0] din
// .wr_en(din_en), // input wire wr_en
// .rd_en((!empty_fifo8to2) & 1'b1), // input wire rd_en
// .dout(fifo1_dout), // output wire [1 : 0] dout
// .full(), // output wire full
// .empty(empty_fifo8to2) // output wire empty
//);
//wire [7:0]fifo2_dout;
//wire fifo2_empty;
ceshi fifo八位输出的数据变化过程
//fifo_2to8 u1 (
// .rst(rst_n), // input wire rst
// .wr_clk(clk), // input wire wr_clk
// .rd_clk(clk), // input wire rd_clk
// .din(fifo1_dout), // input wire [1 : 0] din
// .wr_en(clk), // input wire wr_en
// .rd_en(clk), // input wire rd_en
// .dout(fifo2_dout), // output wire [7 : 0] dout
// .full(), // output wire full
// .empty(fifo2_empty) // output wire empty
//);
endmodule
然后是testbanch代码
`timescale 1ns / 1ps
module top_tb();
reg l_clk;
reg rst_n;
wire din;
wire dout;
reg din_en;
fifotest fifotest_u0(
.rst_n(rst_n),
.clk(l_clk),
.din(din),
.dout(dout),
.din_en(din_en));
initial l_clk = 1;
always #20 l_clk= !l_clk; //15.625
always #10 data_in = 16'b100;
initial begin
rst_n <= 0;
din_en <= 0;
#320;
rst_n <= 1;
#600;
din_en <= 1;
#320;
din_en <= 0;
#18000;
din_en <= 1;
#320;
din_en <= 0;
//#50000000;
#320;
$stop;
end
endmodule
文章浏览阅读3.2k次。source /etc/profile;source /root/.bash_profile;unset NLS_LANG;sqluldr2 user=sjgj/[email protected]:1521/client query="select ZJ as ZJ,TIME as TIME,DHHM as DHHM,XM as XM,LDNR as LDNR,BLLC as B..._ora24345解决方法sqluldr2
文章浏览阅读368次。不管正的歪的很多站长都可以出口成章的总结出一大堆。然而万变不离其宗,SEO优化事实上也就那么多东西。其次再加上SEOer对搜索引擎规则的理解,顺势而行后方可作到一优百优,往往一个关键字上去了,其他的关键字全部都可以借势而上。今天二进制在这里不做具体技术性的解析,只分析一下如何做好
文章浏览阅读221次。Slynyrd像素画教程:像素画基础教程作者:Slynyrd[1]翻译:三二 (转载请注明出处)关注公众号:教你画像素画微信号:pixelfish微博:教你画像素画2014在合适的条件下,你会对自己成长的速度感到惊讶。题图:Slynyrd像素画是什么?像素画是一种以低分辨率美学为特征的数码艺术。低分辨率是像素画的基本特征。然而,起决定因素是意图。应该以精确的方式仔细考虑像素,并不是说每一个像素都需..._excel 800像素
文章浏览阅读2.3k次。Error:Execution failed for task ':app:transformClassesWithDexForZhenghaoDebug'.> com.android.build.api.transform.TransformException: java.lang.RuntimeException: com.android.ide.common.process.Proce..._com.android.build.api.transform.transformexception: java.lang.runtimeexcepti
文章浏览阅读92次。ORACLE错误一览表,方便大家查询!ORA-00001: 违反唯一约束条件 (.)ORA-00017: 请求会话以设置跟踪事件ORA-00018: 超出最大会话数ORA-00019: 超出最大会话许可数ORA-00020: 超..._ora-01045: 用户 c##duaudit 没有 create session 权限; 登录被拒绝
文章浏览阅读1.5k次。1. Java中awt包AWT事件模型Event1) 事件-描述发生了什么的对象2) 事件源-事件的产生器3) 事件处理器-接收事件、解释事件并处理用户交互的方法Button是ActionEvent的对象。事件处理器是一个方法。之前使用层次模型(现在已经不使用了)。事件监听器:委托模型。增加事件处理器button.addActionListener()import java.awt.BorderL..._import java.awt.event.actionevent; import java.awt.event.actionlistener; imp
文章浏览阅读1.7k次。论述oracle数据备份与容灾恢复oracle维护行业已经兴起了很多年了,企业与开发者都纷纷地意识到数据安全的重要性,现在大部分人都有意识地将个人电脑上的重要数据拷贝一份到移动硬盘上,若电脑坏掉,这些数据还可以找回来。这说明大家都有意识地保护好自己重要的数据。以上是个人数据备份的情况,那么企业如何进行数据备份呢?对于企业而言,数据备份越来越显得重要,办公自动化基本普及到每个企业,企业每天都_site oracle容灾备份还原
文章浏览阅读118次。这里展示一下使用表的SHRINK技术完成空间的释放。同时注意,在使用这种方法之前要注意启动行移动的特性(如果不启用,通过报错信息亦可以得到相应的提示信息)。1.默认情况下表上的行移动是关闭的如果不是关闭的状态,我们也可以使用下面..._shrink space清理空块
文章浏览阅读195次。H5页面input输入框含有键盘自带的表情符时显示异常_js h5输入框输入表情 显示键盘自带表情符
文章浏览阅读5.6k次。最近工作中遇到一个关于@AutoWired注解使用的细节问题,以前没有注意到,现在特意记录一下。问题描述:在我的一个工具类中,使用@Autowired需要注入一个dao对象,然后工具类的方法中会调用该dao对象中的方法,在运行时发现报空指针异常,dao对象居然是null。相关代码如下:工具类代码如下:/** * 对象级的码表转换工具类 * @author: lsl */p..._springmvc 使用@autowired 调用dao时null
文章浏览阅读5.9k次,点赞3次,收藏58次。参考:https://github.com/MarcioCerqueira/RealTimeSpecularHighlightRemoval论文:Real-Time High-Quality Specular Highlight Removal using Efficient Pixel Clustering图像增强:opencv去除图片的高光import cv2import os,shutil#找亮光位置def create_mask(imgpath): image = cv2.i_图片去除光线python
文章浏览阅读3.2k次。•UITableView的每一行都是一个UITableViewCell,通过dataSource的tableView:cellForRowAtIndexPath:方法来初始化每一行•UITableViewCell内部有个默认的子视图:contentView,contentView是UITableViewCell所显示内容的父视图,可显示一些辅助指示视图••辅助指示视图的作用是显示一个表_uitableviewcell contentview