Verilog语言(数字逻辑课程笔记二)——赋值语句

发布网友 发布时间:2024-09-27 01:42

我来回答

1个回答

热心网友 时间:9分钟前

Verilog HDL在相当长的时间内,仍是IC设计人员不可或缺的技能。

教师和教材都过于强调Verilog语言的硬件特性和可综合特性。将Verilog语言的行为级语法只作为语法设定来介绍,忽略了Verilog语言的软件特性和仿真特性。使得初学者无法理解Verilog语言在行为级语法(过程块、赋值和延迟)背后隐藏的设计思想。

今天芯博士为大家分享《Verilog语言(数字逻辑课程笔记二)——赋值语句》希望能为大家带来帮助,干货满满,点赞收藏。

填写IC入行指导,还能免费领取试听课,以及相关学习电子资料。

▶《经典Verilog100多个代码案例》

▶《Verilog数字系统设计教程》

赋值语句

连续赋值

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

1 assign =

➢ 等式左边必须是一个标量或者线性向量,而不能是寄存器类型;

➢ 等式右边的类型没有要求,等式右边的值一旦发生变化,就会立刻重新计算并同时赋值给左侧。

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

19 ha u0 (a[i],b[i],sum[i],cout[i]);

20 end

21 endgenerate

22 endmodule

文章长度有限,该学习笔记将持续更新,点赞收藏。

来自CSDN秘密果酱博主的,已获博主许可,转载请联系博主。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com