Verilog HDL的建模

    xiaoxiao2022-06-24  33

    September 13, 2016 作者:dengshuai_super 出处:http://blog.csdn.net/dengshuai_super/article/details/52535925 声明:转载请注明作者及出处。


    建模方式:抽象层次

    HDL语言用于建模时,可以根据抽象的层次进行分类: 可以用高级别的的愈发描述需求和概念(系统级) 可以将需求概念用数学形式描述(算法级) 可以用通用寄存器的传输操作来描述(RTL)(我们用语言来描述的代码都可以归结为寄存器的传输操作) 可以将通用寄存器描述的模型转变为逻辑门描述的模型(Gate-level) 可以将逻辑门描述的模型转变为用电路开关描述的模型(Switch-level)

    建模方式:三种建模方式

    HDL建模时,除了可以用不同层次的抽象进行分类,还可以根据其对信号的描述方式的不同划分为以下三种: 1、数据流建模 2、行为建模 3、结构化建模 在模块中对信号资源分配(或组合逻辑的连接)的描述,成为数据流描述(Data-flow Description),或称为数据流建模(Data-flow Modeling) 在模块中对信号的行为进行的描述,称为行为描述(Behavioral Description),或称为行为建模(Behavioral Modeling) 将诸多模块组织成一个更大的模块,其描述称为结构化描述(Structural Description),或称为结构化建模(Structural Modeling)

    例:二选一多路器

    1、数据流建模

    //二选一多路器的Verilog数据流建模 module two_to_one_dataflow(a,b,s,f); input a; input b; input s; output f; assign f = (a&~s)|(b&s);//等号在这里是一个阻塞赋值 endmodule `timescale 1ns / 1ns module two_to_one_dataflow_tb; reg a,b,s; wire f; two_to_one_dataflow u1(.a(a),.b(b),.s(s),.f(f)); initial begin a = 0; b = 0; s =0; forever begin #20 a = 0; b = 0; s =0; #20 a = 1; b = 0; s =0; #20 a = 0; b = 1; s =0; #20 a = 1; b = 1; s =0; #20 a = 0; b = 0; s =1; #20 a = 1; b = 0; s =1; #20 a = 0; b = 1; s =1; #20 a = 1; b = 1; s =1; end end endmodule

    2、行为建模

    //行为建模 module two_to_one_behaviour(a,b,s,f); input a; input b; input s; output f; reg f;//什么时候声明为寄存器reg,什么时候声明为线网wire,默认情况之下声明为wire //行为语句,说明他要做什么事情就行了,always后面跟着一个信号敏感表 always @ (a,b,s) //always语句称为行为描述语句,行为描述语句的驱动的信号一定声明为reg begin f <=(a&~s)|(b&s);//非阻塞赋值 end endmodule //显式建模和隐式建模的关系 //显式建模(EM):当我们要建立一个模型的时候,我们建立无论是数据流或者是行为,显式建模 //它的模块的名称端口的名称,端口的方向都是显式声明的。 //隐式建模(IM):被引用的信号就是它的输入,被驱动的信号就是它的输出(以上always语句就是IM) `timescale 1ns / 1ns module two_to_one_behaviour_tb; reg a,b,s; wire f; two_to_one_behaviour u1(.a(a),.b(b),.s(s),.f(f)); initial begin a = 0; b = 0; s =0; forever begin #20 a = 0; b = 0; s =0; #20 a = 1; b = 0; s =0; #20 a = 0; b = 1; s =0; #20 a = 1; b = 1; s =0; #20 a = 0; b = 0; s =1; #20 a = 1; b = 0; s =1; #20 a = 0; b = 1; s =1; #20 a = 1; b = 1; s =1; end end endmodule

    3、结构化建模

    module and_gate_behaviour(a,b,f); input a; input b; output f; reg f; always @(a,b) begin f <= (a&b); end //and (f,a,b); endmodule module or_gate_behaviour(a,b,f); input a; input b; output f; reg f; always @(a,b) begin f <= (a|b); end // or (f,a,b); endmodule module inverter_behaviour(a,f); input a; output f; reg f; always @(a) begin f <= ~a; end endmodule module two_to_one_structural(a,b,s,f); input a; input b; input s; output f; wire x1,x2,x3; inverter_behaviour u1(.a(s),.f(x1)); and_gate_behaviour u2(.a(a),.b(s),.f(x3)); and_gate_behaviour u3(.a(b),.b(x1),.f(x2)); or_gate_behaviour u4(.a(x3),.b(x2),.f(f)); endmodule `timescale 1ns / 1ns module two_to_one_structural_tb; reg a,b,s; wire f; two_to_one_structural u1(.a(a),.b(b),.s(s),.f(f)); initial begin a = 0; b = 0; s =0; forever begin #20 a = 0; b = 0; s =0; #20 a = 1; b = 0; s =0; #20 a = 0; b = 1; s =0; #20 a = 1; b = 1; s =0; #20 a = 0; b = 0; s =1; #20 a = 1; b = 0; s =1; #20 a = 0; b = 1; s =1; #20 a = 1; b = 1; s =1; end end endmodule

    来源: https://ke.qq.com/user/tasks/index.html?cid=117307#tid=100127911&fr=2

    转载请注明原文地址: https://ju.6miu.com/read-1123963.html

    最新回复(0)