本帖最后由 abner_ma 于 2021-1-28 18:20 编辑

由于某些原因,又重新看是看了本科的教材——《电子技术基础数字部分》,经过两年半的工作,再次看到上面的内容,感觉到自己的基础环节着实薄弱,所以,就从书上找些基础内容,学习记录下来;

组合逻辑电路

原来,典型的一些中规模集成电路,都是属于组合逻辑电路,比如:编码器,数据选择器,数据分配器,数值比较器,算数逻辑运算单元等。

组合电路的结构具有如下特点:


  • 输出、输入之间没有反馈延迟通路;
  • 电路中不含具有记忆功能的元件。
组合逻辑电路的门级建模基本门级元件

Verilog语言中内置了12个基本门级元件模型:门级元件的输出、输入必须为线网类型的变量。

当这些元件进行逻辑仿真时,仿真软件回根据程序的描述给每个元件中的变量分配逻辑0,逻辑1,不确定态x,和高阻态z这4个值之一。

[color=rgba(0, 0, 0, 0.75)]元件符号功能说明元件符号功能说明
and多输入端的与门nand多输入端的与非门
or多输入端的或门nor多输入端的或非门
xor多输入端的异或门xnor多输入端的异或门
buf多输入端的缓冲器nor多输入端的反相器
bufif11控制信号高电平有效的三态缓冲器notif1控制信号高电平有效的三态反相器
bufif0控制信号低电平有效的三态缓冲器notif0控制信号低电平有效的三态反相器

设计举例

用Verilog语言的门级元件进行描述:由三态门构成的2选1数据选择器。

[分析]2选1选择器的门级描述如下述程序所示。两个三态门的输出都与L相连,即输出线L被两个三态门驱动,为了说明这种情况,建议将输出变量L定义成tri数据类型。

// Gate-level description of a 2-to-1-line multiplexer
  • module _2to1muxtri(A, B, SEL, L);
  •     input A, B, SEL;
  •     output L;
  •     tri L;
  •     bufif1(L, B, SEL);
  •     bufif0(L, A, SEL);
  • endmodule
  • 复制代码

    这里差一个图。

    组合逻辑电路的数据流建模

    对于基本单元逻辑电路,使用Verilog语言提供的门级元件模型描述电路非常方便,但随着电路复杂性的增加,使用的逻辑门较多时,使用HDL门机描述的工作效率就很低。

    数据流建模能够在较高的抽象级别描述电路的逻辑功能,并且通过逻辑综合软件,能够自动将数据流描述转换为门级电路。

    运算符

    有点基础的就不用在此叙述了,运算符有双目运算符,单目运算符,三目运算符(不常用,全等===和不全等!==)。

    要注意,位运算和缩位运算,在之前的文章中有介绍Verilog实用操作

    数据流建模举例

    使用条件运算符描述一个2选1的数据选择器。在连续赋值语句中,如果SEL=1,则输出L=A,否则L=B。

    // Dataflow description of 2-to-1-line multiplexer
  • module mux2x1_df(A, B, SEL, L);
  •     input A, B, SEL;
  •     output L;
  •     assign L = SEL ? A : B;
  • endmodule
  • 复制代码

    从上面的例子看,数据流建模根据电路的逻辑功能进行描述,不必考虑电路的组成以及元件之间的连接,时描述组合逻辑电路常用的一种方法。

    组合逻辑电路的行为级建模

    行为级建模就是描述数字逻辑电路的功能和算法,一般使用always结构,后面跟着一系列过程赋值语句,给reg类型的变量赋值。

    在always结构内部使用的逻辑表达式就是一种过程赋值语句,除此之外,还有一些与高级程序设计语言类似的语句,常用的有条件语句(if-else)和多路分支语句(case-endcase)等。

    重要的敏感变量

    行为级描述的标识是always结构。

    always是一个循环执行语句,在它后面跟着循环执行的条件@(SEL or A or B)(注意后面没有分号),它表示圆括号内的任一变量发生变化时,下面的过程复制语句就会被执行一次,,执行完最后一条语句后,执行挂起,always语句再次等待变量发生变化,因此将圆括号内列出的变量成为敏感变量。

    对组合逻辑电路来说,所有的输入信号都是敏感变量,应该被写在圆括号内。

    注意:


    • 敏感变量之间使用关键词or代替了逻辑或运算符|;
    • 过程赋值语句只能给寄存器型变量赋值,因此,程序中将输出变量L定义成reg数据类型。
    行为级建模举例

    混合使用if-else和case语句描述带有是能控制端的4选一数据选择器。

    // Behavioral description of 4-to-1 line multiplexer
  • module mux4to1_bh(A, SEL, E, L);
  •     input [3:0] A;
  •     input [1:0] SEL;
  •     output L;
  •     reg L;
  •     always @(A or SEL or E) begin
  •         if (E == 1) begin
  •             L = 0;
  •         end else begin
  •             case(SEL)
  •                 2'd0: L = A[0];
  •                 2'd1: L = A[1];
  •                 2'd2: L = A[2];
  •                 2'd3: L = A[3];
  •             endcase
  •         end
  •     end
  • endmodule        
  • 复制代码

    用Verilog对组合逻辑电路建模时有三种不同的描述风格,即:


    • 门级建模;
    • 数据流建模;
    • 行为级建模;