Verilog描述方式

在Verilog中,有3种最基本的硬件描述方式:

(1)数据流描述,采用assign连续赋值语句。

(2)行为描述,使用always语句或initial语句块中的过程赋值语句。

(3)结构化描述,实例化已有模块。

1.数据流描述

信号从输入流向输出,不需存储。数据流描述最基本的语句是assign连续赋值语句。

连续赋值语句用于对 wire 型变量进行赋值,有以下特点:

(1)连续驱动,任何时刻输入的任何变化都将导致该语句重新计算。

(2)只有wire类型能在assign中赋值。

(3)建议使用assign对组合逻辑建模,因为assign语句的连续驱动特点与组合逻辑行为非常相似,且在assign语句中加延时可以精确模拟组合逻辑的惯性延时。

(4)并行性,assign语句和行为语句块(always和initial)、其他连续赋值语句、门级模型之间是并行的。

例:1位全加器

module full_adder1(
        input   Ai, Bi, Ci,
        output  So, Co);

        assign {Co, So} = Ai + Bi + Ci ;
        assign So = Ai ^ Bi ^ Ci ;
        assign Co = (Ai & Bi) | (Ci & (Ai | Bi));

endmodule

2.行为描述

 行为描述是指用语言描述电路的行为,有initial和always两种语句。

initial语句块在0仿真时刻开始执行,且只执行一次;always语句块也在0时刻执行,但会一直循环执行。

时钟发生器举例:

`timescale 1ns/1ps //表示时延单位为1ns,时间精度1ps
module clock_gen(
                output reg clk
                 );
        
initial begin
            clk = 0;
end
always #5 clk<=~clk;
endmodule

1.阻塞赋值和非阻塞赋值

过程赋值只能在always块或initial块中,分阻塞赋值和非阻塞赋值,格式如下:

阻塞赋值:变量名 = 表达式;  非阻塞赋值:变量名 <= 表达式。

在阻塞赋值中,执行下一条语句前,一个表达式只能赋给一个数据类型的值,会阻断其他语句执行。在非阻塞赋值中,表达式的值在always块结束时进行赋值,不阻断其他语句执行。

基本原则是(1)组合电路使用阻塞赋值(2)时序电路使用非阻塞赋值

2.always块基本语法格式

always@(敏感信号列表)

begin

顺序执行语句

end

敏感信号列表是always块响应的信号和事件列表,组合电路的敏感列表需包含所有输入信号,可用always @*表示包含所有输入信号

3.模块实例化

模块实例化指在一个模块中调用另一个模块,对端口进行连接。端口对应方式有名称对应及位置对应,名称对应格式如下:

模块 实例名称(

        .模块端口名称1(实例外部信号)

        .模块端口名称2(实例外部信号)

        );

posted @ 2022-09-04 22:19  继续加仓  阅读(619)  评论(0)    收藏  举报