当前位置:   article > 正文

Verilog语言简介(数字逻辑课程笔记)

verilog语言

Verilog语言简介(数字逻辑课程笔记)

概述

Verilog是一种硬件描述语言:用形式化方法(文本形式)来描述和设计数字电路和数字系统的高级模块化语言。可编写设计文件、建立电路模型、编写测试文件进行仿真。

数据类型

1.变量值

  • 0:代表逻辑0或否条件;在电路中一般是低电平
  • 1:代表逻辑1或真条件;在电路中是高电平
  • X:代表未知的逻辑值(可能为0或1);一般是寄存器类型(reg)未初始化
  • Z:代表一个高阻态;是线型(wire)变量未接驱动

2.wire & reg

  • wire: 线网; 用来表示硬件单元之间的物理连线
wire a;
wire b;
wire c=1'b0;
  • 1
  • 2
  • 3
  • reg: 寄存器; 用来表示存储单元
reg rstn;
initial begin
     rstn=1'b0;
     #100;
     rstn=1'b1;
 end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3.向量vector

  • 标量Scalar: 1-bit位宽的线网或寄存器类型
    wire n1;
    reg d1;
  • 向量Vector:n-bit位宽的线网或寄存器类型
    wire [3:0] n0;
    reg[3:0] d0;

4.数组Array

  • 在Verilog中允许声明reg, wire, integer, time, real及其向量类型的数组
// y is an scalar reg array of depth=12, each 1-bit wide
reg y1[11:0];
//y is an 8-bit vector net with a depth of 4
wire [0:7] y2 [3:0];
//y is a 2D array rows=2, cols=4 each 8-bit wide
reg [7:0] y3 [0:1][0:3];
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 存储器:寄存器数组模拟存储器,可用来描述RAM或ROM的行为
module des();
//reg vector 8-bit wide
reg [7:0] mem1;
//8-bit wide vector array with depth=4;
reg [7:0] mem2 [0:3];
//16-bit wide vector 2D array with rows=4, cols=2
reg [15:0] mem3[0:3][0:1];

initial begin
 mem=8'ha9;
 $display("mem1 = 0x%0h", mem1);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

5.其他类型

  • integer: 32位宽的通用整型变量,可在对硬件建模时用于其他目的(可综合)
  • time: 无符号64位宽,可用于存储仿真时间量以进行仿真调试,realtime变量时将时间存储为浮点数(不可综合)
  • real:实数变量,可存储浮点值, 可以与integer和reg相同的方式进行赋值(不可综合)
  • string:字符串,存储在reg中, reg变量的宽度必须足够大以容纳字符串(可综合)

模块构建

模块
操作符
赋值语句
generate
连续赋值
过程赋值
assign
always
initial
阻塞赋值
非阻塞赋值

Verilog的基本设计单元是模块。

模块由四个主要部分组成:

  • 端口定义:module 模块名(端口1,端口2,…)
  • I/O说明:包括输入(input)、输出(output)和双向(inout)
  • 信号类型声明:声明信号的数据类型和函数声明wire,reg,integer,real,time
  • 功能描述:用来描述设计模块的内部结构和模块端口间的逻辑关系。常用assign语句、always块语句等方法实现
module block1(a,b,c,d);
input a,b,c;
output d;
wire x;
assign d=a|x;
assign x=(b&~c);
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

模块是一个具有特定功能的设计单元,在电路综合时模块会被转换为相应的数字电路
给定模块一组输入,模块会返回一组输出,这意味着模块可以被重复使用,由此来实现更复杂的电路
按照如下形式来实例化模块:

module mod1(input d,...);
//contents of the module
endmodule

module mod2;
   wire data;
   mod1 u0(.d(data),...);
   //contents of the module
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

操作符

操作符也称运算符, 是Verilog HDL预定义的函数符号。

功能符号含义
算术运算符+,-,* , /,%, **加,减,乘,除,求模,求幂
逻辑运算符&&,II, !(单目)逻辑与,逻辑或,逻辑非
关系运算符<, >, <=, >=小于,大于,小于等于,大于等于
等值运算符= =, !=, = = =, != =等于,不等,全等,不全等
缩减运算符&,~ &,I,~ I,^ , ^ ~ /~ ^与,与非,或,或非,异或,同或(都为单目)
条件运算符信号 = 条件?表达式1:表达式2;条件为真时,信号取表达式1的值,为假,取表达式2的值
位运算符~(单目),&, I,^ ,^ ~ , ~ ^按位取反,按位与,按位或,按位异或,按位同或
移位运算符>>, <<右移,左移(后空位补0)
位拼接运算符{信号1的某几位,…,信号n的某几位}用于将两个或多个信号的某些位拼接起来
  • 在逻辑运算中,如果操作数不止一位,应将操作数作为一个整体来对待
  • 两个不同长度的操作数进行位运算时,将自动按右端对齐,位数少的操作数会在高位用0补齐。
  • 关系运算符优先级低于算术运算符,返回结果为逻辑值,0或1或x
  • 等于运算符(= =)和全等运算符(===)的区别: 使用等于运算符时,两个操作数必须逐位相等,结果才为1,若某些位为x或z,则结果为x;使用全等运算符时,若两个操作数的相应位形式上完全一致,则结果为1,否则为0.
操作数个数
单目运算符
双目运算符
三目运算符

在这里插入图片描述

赋值语句

连续赋值

连续赋值语句是 Verilog 数据流建模的基本语句,用于对 wire 型变量进行赋值。其格式如下:

assign <net_expression> = <expressiom of different signals or constant value>
  • 1

➢ 等式左边必须是一个标量或者线性向量,而不能是寄存器类型
➢ 等式右边的类型没有要求,等式右边的值一旦发生变化,就会立刻重新计算并同时赋值给左侧

module xyz;
wire i1, i2;
wire out;
assign out=i1 & i2;
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

过程赋值
  • 过程赋值是在 initial 或 always 语句块里的赋值,主要用于对寄存器类型变量进行赋值
  • 寄存器变量在被赋值后,其值将保持不变,直到重新被赋予新值
  • 过程赋值只有在语句执行的时候,才会起作用
  • Verilog 过程赋值包括 2 种语句:阻塞赋值与非阻塞赋值
过程赋值语句块:always语句块

➢ 通常带有触发条件
➢ 语句块中的语句会重复执行
➢ 一个变量不能在多个 always 块中被赋值
➢ 在 always 块中被赋值的只能是 register 型变量
➢ always 语句块即可以用来实现组合逻辑也可以用来实现时序逻辑

模块声明:

always @(event)
     [statement]
always @event begin
     [multiple statements]
end
  • 1
  • 2
  • 3
  • 4
  • 5

不带有敏感信号的 always 语句块会一直
执行
➢ 可用于仿真时钟信号生成

always #10 clk= ~clk;
  • 1

always设计组合电路
代码示例:

module combo (input a, b, c, d, e,
                             output reg z);
       always @ ( a or b or c or d or e) begin
          z= ((a & b) | (c ^ d) & ~e);
       end
       
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

always设计时序逻辑电路

➢ 模N计算器,计数器从0开始,每个时钟周期上升沿自加1,计算器加到N-1之后重新从0开始计数。
➢ 模N计数器需要 log2

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/784424
推荐阅读
相关标签