- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
FPGA中时序注意点
FPGA中时序相关注意点
版本记录表 作者 版本号 日期 修改内容 王长友 V1.00.a 2015.07.05 第一次创建
1.信号在组合逻辑和时序逻辑中作用时序
在FPGA中同一信号对组合逻辑和时序逻辑作用时刻却是不同,组合逻辑中信号只要建立完成则立即有效,而时序逻辑中信号需要在下一个时钟到来的时候方能有效。所以组合逻辑的作用结果也是在当前立即出现的,而时序逻辑的作用结果要等到下一次时钟方可出现。
例如以下代码:
always@(posedge clk)
begin
a = ~a;
end
assign b = a;
always@(posedge clk)
begin
c = a;
end
因为b,c由a信号生成,按图1分析。在第3个时钟开始信号a在上升沿赋值为1,经过延时A信号a建立完成;信号b在信号a生成时直接起作用,则在延迟时间B后信号b建立;信号a在第3个时钟的上升沿刚开始建立,换句话说信号a在此时还是低电平,在第4个时钟上升沿是信号a才对信号c有效,所以信号c在延迟时间C后才建立完成。
图1
仿真结果如图2:
图2
因为在仿真中没有加入延迟信息,所以信号b与a基本保持一致,信号c比a延迟一个时钟。
以下一个调用RAM和ROM的仿真时序对比,RAM一般使用时序逻辑而ROM使用组合逻辑;我们在其相应的地址存入相应的数据,即地址为1 的地方存入数据1,地址为X的地方存入数据X;然后依次读出。
其代码如下:
module top_test(
input clk,
input we,
input [8:0] addr,
input [15:0] din,
output [15:0] douta,
output [15:0] doutb
);
rom_1k u0_rom_1k(
.clk (clk),
.addr (addr),
.dout (douta)
);
ram_1k u0_ram_1k (
.clka (clk),
.wea (we),
.addra (addr),
.dina (din),
.douta (doutb)
);
endmodule
其仿真代码如下:
integer i= 0;
#10;
we = 1b0;
i = 0;
repeat(512)
begin
#10;
addr = i;
i= i + 1b1;
end
#100;
$stop();
仿真波形如图3,ROM输出结果与地址同步,而RAM则延迟一个时钟。RAM的读地址和FIFO的读操作类似,FIFO读操作的结果也必须在下一个时钟周期才可输出。
图3
2.同一组信号在时序同步
我们在程序中经常会遇到一些数据线上的数据不是一直有效,只有在特定时间有效,所以我们一般会加一条数据有效指示信号去表明数据的有效时间。例如MCU写到FPGA的地址数据和写使能信号,同步串口的门控信号与数据信号等等。如图4,一般情况下数据和数据有效信号必须保持同步,数据只有在阴影部分是有效的,其他地方的值我们不关心。
图4
所以我们在生成一组data和data_valid信号时也要注意其同步性,避免使用data_valid产生data信号,以致出现data_valid信号早于或晚于data信号,如同图5的状态。
图5
相应的在使用此类信号时对data_valid信号的判断和data信号的取值也应该在同一个clock周期内,不能先判断data_valid然后下一时钟周期再去取data的值。
3.需要缓存一级时钟的信号分析
在FPGA程序中,我们时常见到有些信号被延迟一个时钟的情况,以下我们介绍以下需要被延迟一个时钟周期的情况。
1,通常异步输入的信号我们都需要缓存一个时钟周期再使用。因为在异步输入过程中异步信号与我们本地时钟没有必然的生成关系,如果在异步信号发生转变的过程中本地时钟的采样沿正好遇到,有可能出现异步信号在建立过程中而导致采集到得信号异常。如图6所示。
图6
在第二个时钟上升沿,外部信号正好在下降过程中,如果在此时对外部信号采样则采到的信号可能出现不稳定状态,而这种情况在仿真中无法验证只有在实际FPGA运行中才可以看到。例如在我们uart组件v1.01a版本中,rxd为异步输入信号,被我们直接使用,代码如下:
if(rxd ==1)
cnt =0;
else
cnt =cnt +1;
if(rxd == 0) begin
n
文档评论(0)