verilog行为建模(一):基本概念

微信公众号获取更多FPGA相关源码:
在这里插入图片描述

1.行为描述

  • 行为级描述是对系统的高抽象级描述。在这个级别,表达的是输入和输出之间转换的行为,不包含任何结构信息。
  • Verilog有高级编程语言结构用于行为描述,包括:wait, while, if then, case和forever。
  • Verilog的行为建模是用一系列以高级编程语言编写的并行的、动态的过程块来描述系统的工作。

D触发器

  • 在每一个时钟上升沿,若Clr不是低电平,置Q为D值,置Qb为D值的反。
  • 无论何时Clr变低,置Q为0,置Qb为1

2.过程(procedural)块

  • 过程块是行为模型的基础。
  • 过程块有两种:
  1. initial块,只能执行一次
  2. always块,循环执行
  • 过程块中有下列部件
  1. 过程赋值语句:描述过程块中的数据流
  2. 高级结构(循环,条件语句):描述块的功能
  3. 时序控制:控制块的执行及块中的语句。

过程块

3.过程赋值(procedural assignment)

  • 在过程块中的赋值称为过程赋值。
  • 在过程赋值语句中表达式左边的信号必须是寄存器类型(如reg类型)
  • 在过程赋值语句等式右边可以是任何有效的表达式,数据类型也没有限制。
  • 如果一个信号没有声明则缺省为wire类型。使用过程赋值语句给wire赋值会产生错误。

过程赋值时声明缺省报错

module adder (out, a, b, cin);
      input a, b, cin;
      output [1:0] out;
      wire a, b, cin;
      reg half_sum;
      reg [1: 0] out;
   always @( a or b or cin)
   begin
      half_sum = a ^ b ^ cin ; // OK
      half_carry = a & b | a & !b & cin | !a & b & cin ; // ERROR!
      out = {half_carry, half_ sum} ;
   end
endmodule

4.过程时序控制

在过程块中可以说明过程时序。过程时序控制有三类:

  1. 简单延时(#delay):延迟指定时间步后执行
  2. 边沿敏感的时序控制:@(<signal>)
  • 在信号发生翻转后执行。
  • 可以说明信号有效沿是上升沿(posedge)还是下降沿(negedge)。
  • 可以用关键字or指定多个参数。
  1. 电平敏感的时序控制:wait(<expr>)
  • 直至expr值为真时(非零)才执行。
  • 若expr已经为真则立即执行。
module wait_test;
reg clk, waito, edgeo;
initial begin
initial begin clk = 0;edgeo=0;waito=0;end
always #10 clk = ~clk;
always @(clk) #2 edgeo = ~edgeo;
always wait(clk) #2 waito = ~waito;
endmodule

时序图

5.简单延时

在test bench中使用简单延时(#延时)施加激励,或在行为模型中模拟实际延时。

module muxtwo (out, a, b, sl);
      input a, b, sl;
      output out;
      reg out;
   always @( sl or a or b)
      if (! sl)
            #10 out = a; 
// 从a到out延时10个时间单位
      else
            #12 out = b;
//从b到out延时12个时间单位
endmodule

在简单延时中可以使用模块参数parameter,例如产生时钟:

module clock_gen (clk);
      output clk;
      reg clk;
      parameter cycle = 20;
      initial clk = 0;
      always
            #(cycle/2) clk = ~clk;
endmodule

6.边沿敏感时序

时序控制@可以用在RTL级或行为级组合逻辑或时序逻辑描述中。可以用关键字posedge和negedge限定信号敏感边沿。敏感表中可以有多个信号,用关键字or连接。

module reg_ adder (out, a, b, clk);
      input clk;
      input [2: 0] a, b;
      output [3: 0] out;
      reg [3: 0] out;
      reg [3: 0] sum;
   always @( a or b) // 若a或b发生任何变化,执行
      #5 sum = a + b;
   always @( negedge clk) // 在clk下降沿执行
           out = sum;
endmodule

特别注意:事件控制符or和位或操作符 | 及逻辑或操作符 || 没有任何关系。

7.wait语句

wait用于行为级代码中电平敏感的时序控制。
下面 的输出锁存的加法器的行为描述中,使用了用关键字or的边沿敏感时序以及用wait语句描述的电平敏感时序。

module latch_adder (out, a, b, enable);
      input enable;
      input [2: 0] a, b;
      output [3: 0] out;
      reg [3: 0] out;
   always @( a or b)
    begin
            wait (!enable) // 当enable为低电平时执行加法
            out = a + b;
    end
endmodule

特别注意:综合工具还不支持wait语句。

微信公众号获取更多FPGA相关源码:
在这里插入图片描述

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值