微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于时序与组合逻辑

关于时序与组合逻辑

时间:10-02 整理:3721RD 点击:

今天写了一个很小的程序,主要是练习语法
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!

很好,学习

很好,学习

很好,学习

很好,学习

很好,学习

很好,学习

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top