关于时序与组合逻辑
今天写了一个很小的程序,主要是练习语法
module reg4(clk,rstn,d,q);
input [3:0] d;
input clk;
input rstn;
output [3:0] q;
reg [3:0] q;
always @(rstn or clk)
q<=(~rstn)?0:d;
endmodule
组合与时序应该是数字领域一个最基本的问题,,但今天却迷糊了,,,突然分不清这二者了。还望指点迷津
这个电平触发应该是组合逻辑了,那时序与组合到底怎么判断的?
既然是组合逻辑,就不能用非阻塞了
q=(~rstn)?0:d;
等效于 if (~rstn)
q=0;
else
q=d;吗?
以上三种写法综合结果是一致的,,麻烦各位大虾分析一下
1. q<=(~rstn)?0:d;
2. q=(~rstn)?0:d;
3. if (~rstn)
q=0;
else
q=d;
我觉得2和3是一样的,1和2,3不同.
虽然1和2,3不同,但事实上应该综合出来的结果是一样的。
写latch的方法(就是只写if不写else,但用非阻塞赋值):
always @(clk or d)
if(clk) q<=d;
语法上面不会有问题吗?比如电平触发是组合逻辑,组合逻辑通常用阻塞赋值。
既然综合出的结果是一样的,,那说明可以互换着写喽?
各位大虾多指点啊
4# shxr
我觉得这个问题,你先不要纠结于时序逻辑和组合逻辑的问题
建议先找关于阻塞赋值与非阻塞赋值的文章看下
看完以后,应该会有新的思路
你看,如果写成always @(posedge clk or negedge rstn)会如何呢
广义的时序逻辑,应该是在逻辑门后由时钟信号触发来保存和输出的电路,在这个定义下,latch和register都是时序逻辑的组件,只不过一个是电平触发一个边沿触发
通常,在verilog设计里,我们所说的时序逻辑只是狭义的指由时钟边沿触发的register
阻塞性和非阻塞性赋值,并不能决定逻辑是否为时序或是组合,它们只是一种标识,用来让EDA工具分辨赋值的并行运行或是串行执行
推荐看verilog synthesis 相关的教程,可以更好的理解电路与代码之间的关系
:》
谢谢各位大虾的建议
多看看数字电路设计的书吧
你这代码 仿真和实际是不一样的,可以说你写的这代码不符合逻辑
9# zhang2000
能说得具体一点吗?
阻塞和非阻塞是有区别,不过对于每个部分只有一个赋值语句来说就是一样的。
恩,,楼上正解 11# meshnet
阻塞赋值一般用于组合逻辑, 非阻塞赋值用于时序逻辑。 它们有本质的区别, 所谓阻塞,就是说必须执行完当前这一句,再执行下一句,是“串行”, 非阻塞赋值是并发,比如放在同一个begin end下的多个赋值同时执行。
小编。你写的代码思路好混乱哦。给你的一个建议是。
1,HDL是描述电路用的。不是设计电路用的,电路的设计是你在写代码前就要在脑子里面想好的。你才能用HDL语言去描述你的电路。这点很重要。
2. 对于你写的代码,说起来比较长。
对于组合和时序电路的分析,组合电路可以用assign和always这两种形式来描述。时序就用always电路来描述。
对于是不是时序电路不是看你的《= 还是 = 而是看你描述的always块的敏感信号是边沿还是电平。
然后就是如果是电平还要考虑LATCH的情况,
你上面的3种情况不同的。
谢谢楼上的耐心解答,,
这三种写法,我认为没有区别,虽然有阻塞和非阻塞赋值,但综合之后是一样的,都是个DFF
一语中的~
HDL是用来描述电路而不是用来设计电路的~
多看看 关于verilog的书吧 多看几遍 体会就深了
你写的这种方式没有意义。
thanks a lot!
很好,学习
很好,学习
很好,学习
很好,学习
很好,学习
很好,学习
