FPGA学习笔记1:Verilog HDL的整体结构

Verilog HDL程序是由模块构成的。

模块可以进行嵌套,从而将大型数字电路分割成不同小模块的设计。如果每个模块都可综合,则可以通过综合工具转化为逻辑单元描述,最后整合成一个很大的逻辑系统。

模块分为两种类型,一种用来生成电路结构,一种用来测试电路的逻辑功能。

每个模块都由module和endmodule两个语句及其间内容定义,要进行端口定义,并说明输入、输出口,描述模块功能。

 

Verilog用于电路描述

第一层:算法级

module muxtwo(out, a, b, sl);
    input a,b,sl
    output out
    reg out;
        always @(sl or a or b)
            if(! sl)    out = a;
            else out = b
endmodule

第二层:RTL级

module muxtwo(out, a, b, sl);
    input a, b, sl;
    output out;
    wire nsl, sela, selb;
        assign nsl = ~sl;
        assign sela = a&nsl;
        assign selb = b&.sl;//.sl代表引用端口
        assign out = sela|selb
endmodule

(前两层均属于行为描述)

第三层:门级

module muxtwo(out, a, b sl);
    input a,b,sl;
    output out;
    
    not     u1(nsl, sl);
    sela #1 u2(sela, a, nsl); //#1代表延迟1个单位时间
    selb #1 u3(selb, b, sl);
    or #1 u4(out, sela, selb);
endmodule

 

综合的过程,就是把第一层的算法级的行为描述,经过第二层RTL级的行为描述的中间形式,自动转化为第三层门级的电路描述。

 

Verilog用于电路测试(信号描述)

描述测试信号的变化和测试过程的模块,也叫测试平台testbench,用于对上述的电路模块进行动态的全方位测试(行为/结构),从而进行调试或验证。

下面是一个例子:

include "muxtwo.v"  //子模块包含
​
module t;
    /*端口定义*/
    reg ain, bin, select;
    reg clock;
    wire outw;
    /*寄存器初始化*/
    initial
        begin
            ain = 0;
            bin = 0;
            select = 0;
            clock = 0;
        end
    /*定义测试信号*/
    always #50 clock = ~clock;//set clock
        
    always @(posedge clock)
        begin
            #1 ain = {$random}%2;//create random data stream
            #3 bin = {$random}%2;
        end
    
    always #10000 select = !select;//stop working by disable sl
    /*引用模块,创建实例进行测试*/  
    muxtwo m(.out(outw), .a(ain), .b(bin), .sl(select));
endmodule

 

你可能感兴趣的:(Verilog)