FPGA入门笔记005——阻塞赋值和非阻塞赋值的区别
1.FPGA入门笔记0012.# FPGA入门笔记002——译码器3.FPGA入门笔记006——状态机设计实例
4.FPGA入门笔记005——阻塞赋值和非阻塞赋值的区别
5.FPGA入门笔记004——BCD计数器设计与使用6.FPGA入门笔记003——计数器IP核调用与验证7.FPGA入门笔记013——嵌入式块RAM使用之FIFO8.FPGA入门笔记012——嵌入式块RAM应用之ROM9.FPGA入门笔记011_B——搭建串口收发与存取双口RAM简易应用系统10.FPGA入门笔记011_A——嵌入式块RAM的使用11.FPGA入门笔记010——UART串口接收模块设计12.FPGA入门笔记009——UART串口发送模块设计13.FPGA入门笔记008——数码管动态扫描设计与验证14.FPGA入门笔记007_A——按键消抖模块设计与验证(状态机、$random、仿真模型、task语法)定义一个示例模组,代码如下:
module block_nonblock( Clk, Rst_n, a, b, c, out ); input Clk; input Rst_n; input a,b,c; output reg[1:0]out; //out = a + b + c,out最大为3,所以设置为两位; //d = a + b; //out = d + c; reg [1:0]d;
阻塞赋值:
阻塞赋值1:
功能代码如下:
always@(posedge Clk or negedge Rst_n) if(!Rst_n) out = 2'b0; else begin d = a + b; out = d + c; end
RTL视图如下:
阻塞赋值2:
功能代码如下:
always@(posedge Clk or negedge Rst_n) if(!Rst_n) out = 2'b0; else begin out = d + c; //更改代码顺序 d = a + b; end
RTL视图如下:
可以看见,当代码顺序不同时,RTL视图也不同,其out的结果和代码顺序有关。
非阻塞赋值
非阻塞赋值1:
功能代码如下:
always@(posedge Clk or negedge Rst_n) if(!Rst_n) out <= 2'b0; else begin out <= d + c; d <= a + b; end
RTL视图如下:
非阻塞赋值2:
功能代码如下:
always@(posedge Clk or negedge Rst_n) if(!Rst_n) out <= 2'b0; else begin d <= a + b; //更改代码顺序 out <= d + c; end
RTL视图如下:
可以看见,当代码顺序不同时,RTL视图相同,其out的输出结果和代码顺序无关。
后仿真结果如下:
当时钟信号处于上升沿1时:
a=0,b=1,随后d经过一段时间的延时从00->01;
d=00,c=0,随后out经过一段时间的延时从01->00;
当时钟处于上升沿2时:
a=0,b = 1,随后d不变;
d=01,c=0,随后out经过一段时间的延时从00->01;
所以非阻塞赋值时,其out的输出结果只与时钟信号处于上升沿时 d 的状态和 c 的状态有关。
本文作者:Yamada_Ryo
本文链接:https://www.cnblogs.com/little55/p/17846924.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步