- 1、本文档共48页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
在可综合的硬件设计中,使用阻塞和非阻塞赋值语句时,应注意以下原则 (1)当用“always”块来描述组合逻辑时,既可以用阻塞赋值,也可以采用非阻塞赋值,应尽量使用阻塞赋值。 (2)对时序逻辑描述和建模,使用非阻塞赋值方式。 (3)为锁存器(Latch)建模,应使用非阻塞赋值。 (4)若在同一个“always”过程块中既为组合逻辑建模,又为时序逻辑建模,最好使用非阻塞赋值方式。 在可综合的硬件设计中,使用阻塞和非阻塞赋值语句时,应注意以下原则 (5)在一个“always”过程块中,最好不要混合使用阻塞赋值和非阻塞赋值,虽然同时使用这两种赋值方式在综合时并不一定会出错,但对同一个变量不能既进行阻塞赋值,又进行非阻塞赋值,这样在综合时会报错。 (6)不能在两个个或两个以上的“always”过程块中对同一个变量赋值,这样会引发冲突,在综合时会报错。 (7)仿真时使用$strobe显示非阻塞赋值的变量。 时序逻辑建模应尽量使用非阻塞赋值方式 【例10.9】 阻塞赋值方式描述的移位寄存器1 module block1(q0,q1,q2,q3,din,clk); input clk,din; output reg q0,q1,q2,q3; always @(posedge clk) begin q3=q2; //注意赋值语句的顺序 q2=q1; q1=q0; q0=din; end endmodule 例10.9的RTL综合结果 【例10.10】 阻塞赋值方式描述的移位寄存器2。 module block2(q0,q1,q2,q3,din,clk); input clk,din; output reg q0,q1,q2,q3; always @(posedge clk) begin q3=q2; q1=q0; //该句与下句的顺序与例10.9颠倒 q2=q1; q0=din; end endmodule 例10.10的RTL综合结果 【例10.11】 阻塞赋值方式描述的移位寄存器3。 module block3(q0,q1,q2,q3,din,clk); input clk,din; output reg q0,q1,q2,q3; always @(posedge clk) begin q0=din; //4条赋值语句的顺序与例10.9中完全颠倒 q1=q0; q2=q1; q3=q2; end endmodule 例10.11的RTL综合结果 【例10.12】 非阻塞赋值方式描述的移位寄存器。 module block4(q0,q1,q2,q3,din,clk); input clk,din; output reg q0,q1,q2,q3; always @(posedge clk) begin q3=q2; q1=q0; q2=q1; q0=din; end endmodule 结 论 对于阻塞赋值来说,赋值语句的顺序对最后的综合结果有着直接的影响。而如果采用非阻塞赋值方式来描述的话,则可以不考虑赋值语句的排列顺序,只需将其连接关系描述清楚即可。 信号在FPGA器件内部通过连线和逻辑门时,都有一定的延时。因此多路信号的电平值发生变化时,在信号变化的瞬间,组合逻辑的输出有先后顺序,往往会出现一些不正确的“毛刺”(Glitch),称为“冒险”(Hazard)现象。 这些毛刺在电路板的设计中由于PCB走线时,存在分布电感和分布电容,所以许多毛刺能够被自然滤除,而在PLD内部没有分布电感和电容,这些毛刺将被完整地保留并向下一级传递,所以在FPGA设计中,如何消除毛刺就变得很重要。 可通过改变设计,破坏毛刺产生的条件,来减少毛刺的发生。例如,在数字电路设计中,常常采用格雷码计数器取代普通的二进制计数器。 还可根据D触发器的D输入端对毛刺不敏感的特点而消除毛刺,举例说明 【例10.23】 长帧同步时钟的产生 module longframe1(clk,strb); parameter DELAY=8; input clk; output reg strb; reg[7:0] counter; always@(posedge clk) begin if(counter==255) counter=0; else counter=counter+1; end always@(counter) begin if(counter=(DELAY-1)) strb=1; else strb=0; end endmodule 引入了D触发器的长帧同步时钟的产生 module lon
文档评论(0)