数字逻辑 初识Verilog

数字逻辑 初识Verilog

一、Verilog HDL 模块及端口

1. Verilog HDL 模块声明

模块声明从关键字 module 开始,到关键字 endmodule 结束。

模块的端口列表描述这个模块的输入和输出端口。

模块内部的5个组成部分:变量声明、数据流语句、低层模块实例、行为语句块以及任务和函数。

module <模块名> (<模块端口列表>)
···
<模块的内容>
···
···
endmodule

以一个与门的Verilog模块为例,代码如下:

module andDemo(a, b, c);
    
    input a, b;
    output c;
    
    wire a, b;
    wire c;
    
    assign c = a & b
        
endmodule

2. Verilog HDL 端口声明

Verilog中端口有以下三种类型:

(1)input :模块从外界发送数据的接口,在模块内可以不写。

(2)output :模块往外界发送数据的接口,在模块内可以不写。

(3)inout :可读取数据,也可以送出数据,数据双向流动。

以全加器为例,代码如下:

module fullAdder(a, b, cin, sum, cout);
    // 端口声明的开始
    input a, b, cin;
    output sum, cout;
    // 端口声明的结束
    
    wire a, b, cin;
    wire sum, cout;
    
    assign sum = (a ^ b) ^ c;
    assign cout = cin & (a ^ b) | (a & b);
    
endmodule

端口的默认数据类型是wire型,如果希望端口能保存数据 ,则声明为reg型,即寄存器类型(\(\texttt {register}\))。

3. Verilog HDL 数据类型声明

  1. wire

    wire型数据常用来表示以assign关键字指定的逻辑信号。Verilog程序模块中的输入、输出信号类型默认为wire型。

    wire型信号可以用作方程式的输入,也可以用作assign语句或者实例元件的输出。

    定义格式如下:

    wire [n-1 : 0] 数据名1, 数据名2, ···, 数据名N;
    

    这里,总共定义了 \(N\) 条线,每条线的位宽为 \(n\)​ 。例如:

    wire [2 : 0] a, b, c;
    
  2. reg

    reg型是寄存器数据类型变量的关键字。

    reg型数据常用来表示always模块内的指定信号,代表触发器。

    always模块内被赋值的每一个信号都定义为reg型,即赋值操作符的有效变量必须是reg型。

    定义格式如下:

    reg [n-1 : 0] 数据名1, 数据名2, ···, 数据名N;
    

    这里,总共定义了 \(N\) 条线,每条线的位宽为 \(n\) 。例如:

    reg [2 : 0] a, b, c;
    reg d;
    

    reg型和wire型不同在于reg型保持最新一次的赋值,而wire型需要持续的驱动。

  3. memmory

    Verilog通过对reg型变量建立数组来对存储器建模,可以描述RAM、ROM存储器和寄存器数组。

    数组中每一个单元通过一个整数索引进行寻址。

    定义格式如下:

    reg [n-1 : 0] 存储器名 [m-1 : 0];
    // reg [n-1 : 0]定义了存储单元是一个n位位宽的寄存器
    

    存储器后面的[m-1 : 0]定义了存储单元的数量,例如:

    reg [15 : 0] ROMA [7 : 0];
    // 这个例子定义了一个存储位宽为16位,存储深度为8的存储器
    // 该存储器的地址范围是0~7
    

    reg型和memory型的区别:

    reg [n-1 : 0] rega;		//一个n位的寄存器
    reg memb [n-1 : 0];		//一个由n个1位寄存器构成的存储器组	
    rega = 0;		//合法
    memb = 0;		//非法
    

    如果要对memory读写,必须指定地址。例如:

    memb[0] = 1;
    reg [3 : 0] rom [4 : 1];
    rom[0] = 4^h0;
    rom[1] = 4^h1;
    rom[2] = 4^h2;
    rom[3] = 4^h3;
    
  4. parameter

    在Verilog里用parameter来定义常量,即用parameter来定义一个标识符表示一个常数。

    采用该类型可以提高程序的可读性与可维护性。

    定义格式如下:

    parameter 参数名1 = 数据名1;
    

    例如:

    parameter a1 = 1;
    parameter [3 : 0] s0 = 4^h0;
    				s1 = 4^h1;
    				s2 = 4^h2;
    				s3 = 4^h3;
    
  5. 其他类型

integer:整型变量。

real:声明为real型的变量是双精度浮点数。

realtime:与real变量相同,但是是以实数形式存储时间的值。

wand:表示线和线网,由集电极开路逻辑实现。

wor:表示线或线网,由发射极耦合逻辑实现。

scalared:声明一个线性变量,这个变量的比特可以单独选中或部分选中。

time:64位无符号数的形式存储仿真时间。

posted @ 2025-03-15 11:21  AKgrid  阅读(13)  评论(0)    收藏  举报