第三篇 Verilog入门—数据流建模

一、连续赋值语句

1、连续赋值的目标类型主要是标量线网和向量线网两种。

(1)标量线网,如:wire a,b;

(2)向量线网,如:wire [3:0] a,b;

2、显式连续赋值语句:

(1)<net_declaration><range><name>

(2)assign #<delay><name>=Assignment expression;

 3、隐式连续语句:
(1)<net_declaration><drive_strength><rang>#<delay><name>=Assignment expression;

注释:<net_declaration>(连线型变量类型)

           <rang>(变量位宽),指明了变量类型的宽度,格式为[msb:lsb],缺省为一位

           <drive_stength> (赋值驱动强度)是可选的,只能在“隐式连续赋值语句“中得到指定。它用来对连线型变量受到的驱动强度进行指定。wire (weak0,strong1)out = in1&in2;

            <delay>(延时量)这一项是可选的。  #(delay1,delay2,delay3)

例:显式连续赋值语句

module example_assignmen(a,b,m,n,y);
input [3:0] a,b,m,n;
output [3:0] c,y;
wire [3:0] a,b,m,n,y;
assign y = m|n;
assign #(3,2,4) c=a&b;
endmodule

例:隐式连续赋值语句

module example2_assignment(a,b,m,n,c,y,w);
input [3:0] a,b,m;
output [3:0] c,y,w;
wire  [3:0] a,b,m,n;
wire [3:0] y=m|n;
wire [3:0] #(3,2,4) c=a&b;
wire (stong0,weak1)[3:0]#(2,1,3)w=(a^b)&(m^n);
endmodule

注意!!

· 连续赋值语句要注意以下几点:(硬件电路的延时决定了整个电路的频率)

— 赋值目标只能是线网类型(wire);

— 在连续赋值中,只要赋值表达式的右边表达式任何一个变量有变化,表达式立即被计算,计算的结果立即赋给左边信号(若没有定义延时量);

— 连续赋值语句不能出现在功能块中;

— 多个连续赋值语句之间是并行语句,因此与位置顺序无关。

— 连续赋值语句中的延时具有硬件电路中惯性时延的特性,任何小于其延时的信号变化脉冲都将被滤除掉,不会体现在输出端口上。

二、行为级建模(主要两条语句)

                        类别                           语句
                    过程语句                           initial
                          always(可综合)
                      语句块              串行语句块begin-end(可综合)
              并行语句块fork-join
                    赋值语句              过程连续赋值assign
               过程赋值=、<=(可综合)
                    条件语句                          if-else(可综合)
                case,casez,casex(可综合)
                    循环语句                         forever
                         repeat
                          while

1、initial过程语句(用在仿真和测试)

initial过程语句的语法格式为:
      initial
               begin
                       语句1;
                       语句2;
                       ...
                       语句n;
               end

例:使用innitial过程语句对变量A,B,C进行赋值

module initial_tb1;
initial
        begin
               A=0;B=1;C=0;
               #100  A=1;B=0;    //#100 延时了100个时间单位
               #100  A=0;C=1;
               #100  B=1;
               #100  B=0;C=0;
        end
endmodule

2、always语句块

从语法描述角度,相对于initial过程块,always语句块的触发状态是一直存在的,只要满足always后面的敏感事件列表,就执行过程块。

其语法格式是:always@(<敏感事件列表>)     语句块;              敏感事件列表有或没有都可以

例如:

always @(a)                               //当信号a的值发生改变时
always @(a or b)                          //当信号a或信号b的值发生改变时
always @(posedge clock)                   //当clock的上升沿到来时
always @(negedge clock)                   //当clock的下降沿到来时
always @(posedge clk or negedge reset)    //当clk的上升沿没到来或reset信号的下降沿到来时

3、过程语句使用中需要注意的问题

在信号定义形式方面,无论是对时序逻辑还是组合逻辑描述,Verilog HDL要求再过程语句(initial和always)中,被赋值信号必须定义为”reg“类型。

在敏感事件表方面,这是Verilog HDL语言中一个关键性设计,如何选取敏感事件作为过程的触发条件,在Verilog HDL程序中有一定的设计要求。

(1)、采用过程对组合电路进行描述时,作为全部的输入信号需要列入敏感信号列表。

(2)、采用过程对时序逻辑电路进行描述时,需要把时间信号和部分输入信号列入敏感信号列表。应当注意的是,不同的敏感事件列表会产生不同的电路形式。

$finish  结束信号停止信号

例:用always语句描述4选1数据选择器

module mux4_1(out,in0,in1,in2,in3,sel);
output out;
input in0,in1,in2,in3;
input [1:0] sel;
reg out;
always @(in0 or in1 or in2 or in3 or sel)
               case(sel)
               2'b00;        out=in0;
               2'b01;        out=in1;
               2'b10;        out=in2;
               2'b11;        out=in3;
               default;      out=2'bx;
               endcase
endmodule        

例:用always语句描述同步置数、同步清零计数器

module counter1(out,data,load,reset,clk);
output [7:0] out;                       //8位计数器
input [7:0] data;
input load,clk,reset;
reg [7:0] out;
always @(posedge clk)                   //clk上升沿触发
       begin 
         if(!reset) out=8'h00;          //同步清零,低电平有效
         else if(load) out=data;        //同步置数
         else out = out + 1;
       end
endmodule

例:用always过程语句描述异步清零计数器

module counter2(clear,clk,out);
output [7:0] out;
input clk,clear;
reg [7:0] out;
always @(posedge clk or negedge clear)  //clear低电平清零
begin
        if(clear)
        out = 0;        //异步清零
        else out = out+1;
end
endmodule

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值