assign
在Verilog中,assgin 语句用于连续赋值,其语法不包括 begin 和 end 块。assgin 语句是用来将一个逻辑表达式赋值给一个网线(wire)。
assgin 用于连续赋值,不需要 begin 和 end ,而过程块(如 always)需要使用 begin 和 end 来标识代码块的起始和结束。
每个 assign 语句是独立的,用来描述一个信号的赋值关系。如果在 assign 语句中使用了begin 和 end,Verilog解析器会认为这是一个语法错误,因为 assign 不需要这种结构。
assign 语句不能对同一个输出端口多次赋值,这会导致语法错误。
wire
到目前为止,电路已经足够简单,输出只是输入的简单功能。随着电路变得越来越复杂,需要使用电线(wire)将内部组件连接在一起。声明电线时,应该在模块主体内部进行,并确保在首次使用之前进行正确的定义和连接。
reg
reg [7:0] mem1 [255:0]; : mem1 包含了 256 个 8 位宽的寄存器向量。
reg mem2 [28:0]; : mem2 包含了 29 个 1 位宽的寄存器。
或运算
位或运算:使用 | 操作符对 a 和 b 进行位或运算,assign out_or_bitwise = a | b 。
逻辑或运算:使用 || 操作符对 a 和 b 进行逻辑或运算,assign out_or_logical = a || b 。
按位异或(XOR):使用 ^ 操作符对 a 和 b 进行按位异或运算,assign out_xor_bitwise = a ^ b 。
实例化
实例化就是如果是输入,()里面的数据就输入到端口;如果是输出,()里面的就储存代码运行所输出的数据。
减法操作
减法操作相当于对输入 b 进行按位取反(XOR操作)然后加1,这是因为计算机使用的是二进制补码。为了计算 a - b,可以将其转换为 a +(-b)。而 -b 就是 b 的二进制补码表示。
(1)先对 b 进行按位取反,得到 ~b 。
(2)然后对 ~b 加 1,即 ~b + 1 。
assign & always块
assign 赋值语句左侧必须是 wire 类型,always 块左侧必须是 reg 类型。
当按位与操作符仅用于一个位向量时,它会对该位向量的所有位进行与操作,然后返回一个单个位。
& a [3:0] // AND: a[3] & a[2] & a[1] & a[0] . Equivalent to ( a[3:0] == 4'hf )
对位向量 a [3:0] 中的所有位进行按位与操作,然后返回结果。
| b [3:0] // OR: b[3] | b[2] | b[1] | b[0] . Equivalent to ( b[3:0] != 4'h0 )
对位向量 b [3:0] 中的所有位进行按位或操作,然后返回结果。
^ c [3:0] // XOR: c[3] ^ c[2] ^ c[1] ^ c[0]
对位向量 c [3:0] 中的所有位进行按位异或操作,然后返回结果。
parameter 和 integer
parameter 用于定义常量,其值在编译时确定,不能在仿真运行时改变。
可以用于定义数字、字符串或其他常量类型。
通常用于定义模块中的常量参数,如数据宽度、时钟周期等,以增加代码的灵活性和重用性。
integer 用于声明整数类型的变量,变量的值可以在仿真运行时修改。
可以使用 integer 定义单个整数变量或整数数组。
integer count; // 声明一个整数变量
integer data[7:0]; // 声明一个8位宽的整数数组
parameter 用于声明编译时确定的常量,而 integer 用于声明运行时可变的整数变量。
每个寄存器(或者说每个变量)应当只能被一个 always @(posedge clk) 块(或者 always @(negedge clk) 块)进行赋值操作。
多个 always @(posedge clk) 块同时对 q 进行赋值操作,这会导致冲突和意外的行为。Verilog 中每个时钟边沿只能有一个 always @(posedge clk) 块来操作同一个寄存器,否则会导致仿真或综合时的不确定行为。
$ time 系统任务返回当前的仿真时间。
使用电平作为敏感信号来控制时序,即后面语句的执行需要等待某个条件为真。Verilog 中使用关键字 wait 来表示这种电平敏感情况。例如:
wait (start_enable) ; //等待 start 信号
有限状态机
Moore有限状态机:输出仅与当前状态相关,与输入无关。输出会在一个完整的时钟周期内保持稳定,即使此时输入信号有变化,输出也不会变化。输入对输出的影响要到下一个时钟周期才能反映出来。这也是 Moore 型状态机的一个重要特点:输入与输出是隔离开来的。
Mealy有限状态机:输出不仅取决于当前状态,还取决于输入信号。Mealy 型状态机的输出是在输入信号变化以后立刻发生变化,且输入变化可能出现在任何状态的时钟周期内。因此,同种逻辑下,Mealy 型状态机输出对输入的响应会比 Moore 型状态机早一个时钟周期。
三段式状态机
首先,根据状态机的个数确定状态机编码。利用编码给状态寄存器赋值,代码可读性更好.
(1)状态机第一段,时序逻辑,非阻塞赋值,传递寄存器的状态。
(2)状态机第二段,组合逻辑,阻塞赋值,根据当前状态和当前输入,确定下一个状态机的状态。
(3)状态机第三代,时序逻辑,非阻塞赋值,因为是 Mealy 型状态机,根据当前状态和当前输入,确定输出信号。