• 搜索

  • 移动端

    APP下载
  • 学习中心

Verilog语言(数字逻辑课程笔记二)——赋值语句
2023-11-20 15:53:42324浏览
Verilog HDL在相当长的时间内,仍是IC设计人员不可或缺的技能。

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秘密果酱博主的,已获博主许可,转载请联系博主。

公司总部

电话:199 2141 1380
地址:上海市浦东区碧波路690号张江微电子港7号楼

合肥分站

电话:199 2141 1380
地址:安徽省合肥市高新区创新大道2800号创新产业园二期E1栋

产品链接

移知官网:www.eeeknow.com
教育培训:edu.eeeknow.com
求职招聘:job.eeeknow.com

友情链接

Arm
  • 在线客服
  • 就业老师