Verilog编程之道——行为模型

1 过程赋值

        过程赋值的RHS可以是任何能够计算出值的表达式。LHS必须是一个能够接受RHS赋值的变量。过程赋值分两种:阻塞赋值   非阻塞赋值

        1.1 阻塞赋值

        在顺序块中,阻塞赋值语句必须在它的后续语句执行之前执行,但在并行块中,阻塞语句不能阻止它的后续语句执行。这里的并行块指fork/join语句。

        1.2 非阻塞赋值

        非阻塞赋值能够在不阻塞过程流的情况下允许赋值调度。非阻塞赋值不能阻塞过程流,在非阻塞赋值计算RHS和调度LHS的更改是,他不会阻塞同一块内后续语句的执行。

       

// 仿真器必须保证在一个过程块内对同一变量的不同非阻塞值的执行顺序。
module multiple;
    reg a;
    initial a = 1;
    
    initial begin
        a <= #4 0;  //schedule a = 0 at time 4
        a <= #4 1;  //schedule a = 1 at time 4
    end             //at time 4, a = 1
endmodule


// 如果仿真器并发的执行两个过程块,并且两个过程块包含对同一变量的非阻塞赋值,那个这个变量的结果可能是不定的,也可能是确定的。

module multiple2;
    reg a;
    initial a = 1;
    
    initial a <= #4 0;
    initial a <= #4 1;
                  // at time 4 . a = ??
endmodule

//如果仿真调度时间不同。按照顺序进行赋值

module multiple3;
    reg a;
    initial #8  a <= #8 1;    //executed at time 8  , schedules an update of 1 at time 16
    initial #12 a <= #4 0;    //executed at time 12 , schedules an update of 0 at time 16
                              // at time 16,a = 0
endmodule

2 过程连续赋值

        过程连续赋值是运行表达式对变量或线网连续驱动的过程赋值,包括assign / deassign 语句和 force / release 语句。

        assign过程连续赋值的使用规则:

        1.对变量的assign过程连续赋值优先于所有的其他过程赋值。

         2.deassign过程语句用于终止对此变量的assign过程连续赋值。

        3.对变量做assign过程连续赋值是,变量的值保持不变,直到通过过程赋值或过程连续赋值对这个变量赋一个新值。

        force 和 release 过程语句

        和assign / deassign 语句有类似的作用,但force既可以对变量使用,也可以对线网使用。 

        1 force过程连续赋值优先于过程赋值和assign过程连续赋值,知道在此变量执行release语句。

        2 如果release此变量时,没有active的assign过程连续赋值,那么此变量就保持不变,知道发生过程赋值。

        3如果release变量时,有assign过程连续赋值,那么赋值马上起效。

        4对一个线网的force语句将优于所有对线网的drivers。

3 条件语句

        if语句对应综合出来的逻辑具有优先级,靠前的逻辑少、路径短,靠后的逻辑多、路径长。

        else总是和它最近的if配对,如果不是我们期望的,就需要使用begin end强制与外层if配对

4 循环语句

        Verilog有四种循环语句:

        forever :持续不断的执行,就是死循环

        repeat :执行括号内表达式指定的循环次数,如果表达式是x或z就不执行

        while  :当括号内表达式为true时执行,否则不进入循环或跳出循环、

        for      : 与C相同,括号内分三部分

// 当循环个数是常量的时候,这样书写的for循环是可以综合的
// 如果循环个数是变量的时候。那么任何综合工具都综合不出来。因为硬件规模必须是有限的、固定的。

5 disable语句

        当disable执行的时候,命名块就被终止执行,所以它可以谭咏麟用于停止块、退出循环、或退出task和function。实际上就是用disable实现C语言的continue break return语句

     

6 过程时序控制

        延时控制  #

        事件控制  @

        wait语句,如同操作一个事件控制和while循环的组合

        逻辑门和线网的延迟也会让仿真时间前进

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA读写EEPROM芯片AT24C02实验Verilog逻辑源码Quartus11.0工程文件, FPGA型号为CYCLONE4E系列的EP4CE6E22C8,可以做为你的学习设计参考。 module iic_com( clk,rst_n, sw1,sw2, scl,sda, dis_data ); input clk; // 50MHz input rst_n; //复位信号,低有效 input sw1,sw2; //按键1、2,(1按下执行写入操作,2按下执行读操作) output scl; // 24C02的时钟端口 inout sda; // 24C02的数据端口 output[7:0] dis_data; //数码管显示的数据 //按键检测 reg sw1_r,sw2_r; //键值锁存寄存器,每20ms检测一次键值 reg[19:0] cnt_20ms; //20ms计数寄存器 always @ (posedge clk or negedge rst_n) begin if(!rst_n) cnt_20ms <= 20'd0; else cnt_20ms <= cnt_20ms+1'b1; //不断计数 end always @ (posedge clk or negedge rst_n) begin if(!rst_n) begin sw1_r <= 1'b1; //键值寄存器复位,没有键盘按下时键值都为1 sw2_r <= 1'b1; end else if(cnt_20ms == 20'hfffff) begin sw1_r <= sw1; //按键1值锁存 sw2_r <= sw2; //按键2值锁存 end end //--------------------------------------------- //分频部分 reg[2:0] cnt; // cnt=0:scl上升沿,cnt=1:scl高电平间,cnt=2:scl下降沿,cnt=3:scl低电平间 reg[8:0] cnt_delay; //500循环计数,产生iic所需要的时钟 reg scl_r; //时钟脉冲寄存器 always @ (posedge clk or negedge rst_n) begin if(!rst_n) cnt_delay <= 9'd0; else if(cnt_delay == 9'd499) cnt_delay <= 9'd0; //计数到10us为scl的周期,即100KHz else cnt_delay <= cnt_delay+1'b1; //时钟计数 end always @ (posedge clk or negedge rst_n) begin if(!rst_n) cnt <= 3'd5; else begin case (cnt_delay) 9'd124: cnt <= 3'd1; //cnt=1:scl高电平间,用于数据采样 9'd249: cnt <= 3'd2; //cnt=2:scl下降沿 9'd374: cnt <= 3'd3; //cnt=3:scl低电平间,用于数据变化 9'd499: cnt <= 3'd0; //cnt=0:scl上升沿 default: cnt <= 3'd5; endcase end end `define SCL_POS (cnt==3'd0) //cnt=0:scl上升沿 `define SCL_HIG (cnt==3'd1) //cnt=1:scl高电平间,用于数据采样 `define SCL_NEG (cnt==3'd2) //cnt=2:scl下降沿 `define SCL_LOW (cnt==3'd3) //cnt=3:scl低电平间,用于数据变化 always @ (posedge clk or negedge rst_n) begin if(!rst_n) scl_r <= 1'b0; else if(cnt==3'd0) scl_r <= 1'b1; //scl信号上升沿
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值