Verilog描述——组合逻辑电路浅析

组合逻辑电路浅析

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

组合逻辑电路

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

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

  1. 输出、输入之间没有反馈延迟通路;
  2. 电路中不含具有记忆功能的元件。

组合逻辑电路的门级建模

基本门级元件

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

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

元件符号 功能说明 元件符号 功能说明
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语句再次等待变量发生变化,因此将圆括号内列出的变量成为敏感变量

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

注意:

  1. 敏感变量之间使用关键词or代替了逻辑或运算符|
  2. 过程赋值语句只能给寄存器型变量赋值,因此,程序中将输出变量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对组合逻辑电路建模时有三种不同的描述风格,即:

  1. 门级建模;
  2. 数据流建模;
  3. 行为级建模;

  1. 改关键词可分两部分理解,buf时buffer的缩写,表示该元件完成缓冲器的功能;后面的if1表示完成该功能所需要的条件,即控制信号为逻辑1。 ↩︎

你可能感兴趣的:(#,Verilog,HDL语言及设计)