自己动手写处理器之第二阶段(3)——Verilog HDL行为语句

将陆续上传本人写的新书《自己动手写处理器》(尚未出版),今天是第七篇,我尽量每周四篇

2.6 Verilog HDL行为语句

2.6.1 过程语句

      Verilog定义的模块一般包括有过程语句,过程语句有两种:initial、always。其中initial常用于仿真中的初始化,其中的语句只执行一次,而always中语句则是不断重复执行的。此外,always过程语句是可综合的,initial过程语句是不可综合的。

      1、always过程语句

      always过程语句的格式如图2-10所示。

      always过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中,敏感信号表达式又称为事件表达式或敏感信号列表,当该表达式中变量的值改变时,就会引发其中语句序列的执行。因此,敏感信号表达式中应列出影响块内取值的所有信号。

      (1)敏感信号表达式的格式

      如果有两个或两个以上的敏感信号时,它们之间使用“or”连接,此处还是以32位加法器为例,2.4节是使用assign直接赋值的,其实也可以使用always过程语句实现,如下。只要被加数in1、加数in2中的任何一个改变,都会触发always过程语句,在其中进行加法运算。这里有两个敏感信号in1、in2,使用“or”连接。

module add32(input  wire[31:0]  in1, 
             input  wire[31:0]  in2,
		output reg[31:0]  out);
				 
always @ (in1 or in2)             //使用always过程语句实现加法
begin
      out = in1 + in2;
end

endmodule


      敏感信号列表中的多个信号也可以使用逗号隔开,上面的32位加法器可以修改为如下形式。

module add32(input  wire[31:0]  in1, 
             input  wire[31:0]  in2,
		output reg[31:0]  out);
				 
always @ (in1, in2)             //多个敏感信号使用逗号分隔
begin
      out = in1 + in2;
end

endmodule


      敏感信号列表也可以使用通配符“*”,表示在该过程语句中的所有输入信号变量,上面的32位加法器可以修改为如下形式。

module add32(input  wire[31:0]  in1, 
             input  wire[31:0]  in2,
		output reg[31:0]  out);
				 
always @ (*)                   //使用通配符表示过程语句中的所有输入信号变量
begin
      out = in1 + in2;
end

endmodule

      (2)组合电路与时序电路

      敏感信号可以分为两种类型:一种为电平敏感型,一种为边沿敏感型。前一种一般对应组合电路,如上面给出的加法器的例子,后一种一般对应时序电路。对于时序电路,敏感信号通常是时钟信号,Verilog HDL提供了posedge、negedge两个关键字来描述时钟信号。posedge表示以时钟信号的上升沿作为触发条件,negedge表示以时钟信号的下降沿作为触发条件。还是以32位加法器为例,可以为其添加一个时钟同步信号,如下。


                
  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值