Verilog HDL在相当长的时间内,仍是IC设计人员不可或缺的技能。
教师和教材都过于强调Verilog语言的硬件特性和可综合特性。将Verilog语言的行为级语法只作为语法设定来介绍,忽略了Verilog语言的软件特性和仿真特性。使得初学者无法理解Verilog语言在行为级语法(过程块、赋值和延迟)背后隐藏的设计思想。今天芯博士为大家分享《Verilog语言(数字逻辑课程笔记二)——赋值语句》希望能为大家带来帮助,干货满满,点赞收藏。
识别二维码添加老师
领取Verilog学习资料
▶《经典Verilog100多个代码案例》
▶《Verilog数字系统设计教程》
赋值语句
连续赋值
连续赋值语句是 Verilog 数据流建模的基本语句,用于对 wire 型变量进行赋值。其格式如下:
1 assign <net_expression> = <expressiom of different signals or constant value>
➢ 等式左边必须是一个标量或者线性向量,而不能是寄存器类型;
➢ 等式右边的类型没有要求,等式右边的值一旦发生变化,就会立刻重新计算并同时赋值给左侧。
1 module xyz;
2 wire i1, i2;
3 wire out;
4 assign out=i1 & i2;
5 endmodule
过程赋值
● 过程赋值是在 initial 或 always 语句块里的赋值,主要用于对寄存器类型变量进行赋值
● 寄存器变量在被赋值后,其值将保持不变,直到重新被赋予新值
● 过程赋值只有在语句执行的时候,才会起作用
● Verilog 过程赋值包括 2 种语句:阻塞赋值与非阻塞赋值
过程赋值语句块:always语句块
➢ 通常带有触发条件
➢ 语句块中的语句会重复执行
➢ 一个变量不能在多个 always 块中被赋值
➢ 在 always 块中被赋值的只能是 register 型变量
➢ always 语句块即可以用来实现组合逻辑也可以用来实现时序逻辑
模块声明:
1 always @(event)
2 [statement]
3 always @event begin
4 [multiple statements]
5 end
不带有敏感信号的 always 语句块会一直
执行
➢ 可用于仿真时钟信号生成
1 always #10 clk= ~clk;
always设计组合电路
代码示例:
1 module combo (input a, b, c, d, e,
2 output reg z);
3 always @ ( a or b or c or d or e) begin
4 z= ((a & b) | (c ^ d) & ~e);
5 end
6
7 endmodule
always设计时序逻辑电路
➢ 模N计算器,计数器从0开始,每个时钟周期上升沿自加1,计算器加到N-1之后重新从0开始计数。
➢ 模N计数器需要 log2 𝑁 个触发器来保存计数值
代码示例:
1 module mod10_counter( input clk,
2 input rstn,
3 output reg[3:0] out);
4 always @(posedge clk) begin
5 if(!rstn) begin
6 out<=0;
7 end else begin
8 if (out == 10)
9 out<=0;
10 else
11 out <= out + 1;
12 end
13 end
14 endmodule
阻塞赋值
➢ 阻塞赋值属于顺序执行,即下一条语句执行前,当前语句一定会执行完毕
➢ 阻塞赋值语句使用等号 = 作为赋值符
➢ 仿真中,initial 里面的赋值语句都是用的阻塞赋值
reg_variable = expression
1 always @(posedge clk) begin
2 b=a;
3 c=b;
4 end
非阻塞赋值
➢ 非阻塞赋值属于并行执行语句,即下一条语句的执行和当前语句的执行是同时进行的,它不会阻塞位于同一个语句块中后面语句的执行
➢ 非阻塞赋值语句使用小于等于号 <= 作为赋值符
reg_variable <= expression
1 always @ (posedge clk) begin
2 b<=a;
3 c<=b;
过程赋值语句块:initial语句块
➢ 仅用于仿真,沿时间轴只执行一次
➢ 用途主要是在仿真的初始状态对各变量进行初始化
➢ 不可综合,常用于测试文件中生成激励波形(如复位信号)作为电路的仿真信号
1 initial
2 [single statement]
3 initial begin
4 [multiple statements]
5 end
1 module behave;
2 reg rstn;
3 reg [2:0] a;
4
5 initial begin
6 rstn = 1'b0;
7 #10 rstn = 1'b1;
8 a=3'b001;
9 #30 $finish;
10 end
11 endmodule
generate
generate 可以用来循环实例化模块或条件实例化模块
➢ generate 与 for loop,用来构造循环结构,多次实例化某个模块
➢ generate 与 if else 或 case,用来在多个块之间选择一个代码块
1 //Design for a half-adder
2 module ha (input a,b,
3 output sum,cout);
4 assign sum = a ^ b;
5 assign cout = a & b;
6 endmodule
7
8 //A top level design that contains N instances of half adder
9 module my_design
10 #(parameter N=4)
11 ( input [N-1:0] a, b,
12 output [N-1:0] sum, cout);
13 //Declare a temporary loop variable to be used during
14 //generation and won't be available during simulation
15 genvar i;
16 //Generate for loop to instantiate N times
17 generate
18 for(i=0;i<n;i=i+1) begin<="" div="">
19 ha u0 (a[i],b[i],sum[i],cout[i]);
20 end
21 endgenerate
22 endmodule
文章长度有限,该学习笔记将持续更新,点赞收藏。
来自CSDN秘密果酱博主的,已获博主许可,转载请联系博主。