初识Verilog HDL其一

发布于:2024-09-17 ⋅ 阅读:(53) ⋅ 点赞:(0)


VerilogHDL是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。

1.1 Verilog基础语法

1.11 逻辑值

  • 0: 逻辑低电平,条件为假;
  • 1:逻辑高电平,条件为真;
  • z:高阻态,无驱动:
  • X:未知逻辑电平;

1.12 关键字

module                                      模块开始定义
input                                          输入端口定义
output                                        输出端口定义
inout                                           双向端口定义
integer										寄存器数据类型
parameter                                  	信号的参数定义
localparam 									信号的参数定义
wire wire                                     线网型变量
reg reg                                        寄存器型变量
always                                         产生reg信号语句的关键字
assign                                         产生wire信号语句的关键字
begin                                           语句的起始标志
end                                              语句的结束标志
posedge/negedge                       时序电路的标志
case Case                                   语句起始标记
default Case                                语句的默认分支标志
endcase Case                             语句结束标记
if if/else                                        语句标记
else if/else                                   语句标记
for for                                          语句标记
endmodule                                  模块结束定义

module -------- 模块开始定义,后续跟着模块名

moudle 模块名(一般与 .v 文件的名称是一致的)

wire -------- 线网型变量

wire 可以看作直接的连接,在可综合逻辑中,会被映射成一条真实存在的物理引线

reg -------- 寄存器型变量,变量为无符号数

reg 对有某一时间点,进行保持的功能。在可综合逻辑中,会被映射成一条真实存寄存器

integer -------- 寄存器型变量,变量为有符号数

integer的位宽为宿主机的字的位数,但最小为32,integer定义为32bit的总线

for循环变量需要使用integer类型

parameter -------- 参数定义

parameter 可以在顶层文件通过实例化,来对此功能模块中的参数呢进行修改

localparam -------- 参数定义

localparam 只能在模块内部使用,不能进行实例化

always -------- 描述组合逻辑以及时序逻辑的语法

always@(敏感条件)

什么是敏感条件:
    简单理解,当敏感条件中的电平发生变化的时候,触发一次语句
    
    同时敏感条件中可以填入 * 号 		*号表达的意思是通配符
    	简单理解: 只要有任何一个信号发生变化的时候,都会触发这个语句。 
always块是Verilog中用来描述组合逻辑以及时序逻辑的语法。

需要补充的是一个设计中可以有多个always块,或者说一定有很多个always块。
这些硬件块都是相互独立同时工作的。每个块之间的连接是决定数据流的原因。为了模拟这种行为,一个always块被做成一个连续的过程(硬件不可能断断续续工作),当敏感列表中的一个信号变化时,它就会被触发并执行一些动作(always块内的语句)。

在这里插入图片描述

reg              无符号整数变量,可以选择不同的位宽。

integer          有符号整数变量,32位宽,算术运算可产生2的补码。

real             有符号的浮点数,双精度。

time             无符号整数变量,64位宽(Verilog-XL仿真工具用64位的正数来记录仿真时刻)

1.13 常量

在程序运行过程中,其值不能被改变的量,称为常量

  • parameter常量(或称符号常量)
  • 数字(包括整数、x和z、负数)

x:指不定值,0/1,寄存器类型变量(无初值时为x)

z: 指高阻态,断开

整数型常量(整常量)

整数型常量(整常量)

  1. 二进制整数**(b/B)**
  2. 八进制整数**(o/O)**
  3. 十进制整数**(d/D)**
  4. 十六进制整数**(h/H)**

常量一般用基数表示法

在这里插入图片描述

  • 位宽指换算为二进制后位宽的总长度

  • 为提高可读性,较长数字之间可用下划线隔开,但不能用在<进制><数字>之间。

例如:

8'd171       指的是 位宽为8bit,十进制171
8'hab        指的是 位宽为8bit,十六进制数ab
8'o253       指的是 位宽为8bit,八进制数253
8'b1010_1011 指的是 位宽为8bit,二进制数10101011

换算为二进制后的位宽总长度:可有可无,verilog会自动为常量匹配合适的位宽,当总位宽长度大于实际位宽,自动向左边补零,

当总位宽长度小于实际位宽,则自动截断左边超出的位数

例如:

大于实际位宽:
	'd7与8'd7:表示相同数值,8'd7换算为二进制就是8"b0000 0111,前面5位补0;

小于实际位宽:
	2'd7换算为二进制就是2 b11,超过2位宽的部分被截断。

如果直接写参数,例如100,表示位宽为32bit的十进制数100.

1.14.阻塞赋值

可以理解为顺序执行,执行完一条才会向后面执行

a=1;
b=2;
c=3;

begin
    a = b;
    c = a;
end

/*
最后结果为:
a=2
b=2
c=2
*/

1.15.非阻塞赋值

可以理解为并行执行(同时执行),全部一起执行的

a=1;
b=2;
c=3;

begin
    a <= b;
    c <= a;
end

/*
最后结果为:
a=2
b=2
c=1
*/