数据流级建模
逻辑电路的verilog代码一共有三种建模方式,分别是门级建模,数据流级建模和行为级建模。今天就介绍一下数据流级建模吧。
1. 数据流级建模范例:
1)4输入3输出表达式和电路图:
g=x1x3+x2x4
h=(x1+~x3)(~x2+x4)
f=g+h
2)实现代码
module example4(x1, x2, x3, x4, f, g, h);
input x1, x2, x3, x4;
output f, g, h;
assign g = (x1 & x3) | (x2 & x4);
assign h = (x1 | ~x3) & (~x2 | x4);
assign f = g | h;
endmodule
3)测试代码
module test;
reg x1, x2, x3, x4;
wire f, g, h;
initial
begin
x1 = 1'b0;
x2 = 1'b0;
x3 = 1'b0;
x4 = 1'b0;
#10 x1 = 1'b1;
#10 x2 = 1'b1;
#10 x3 = 1'b1;
#10 x4 = 1'b1;
#20 $stop;
end
example4 myexample4(x1,x2,x3,x4,f,g,h);
endmodule
4)仿真验证
2.数据流级建模基本语法
数据流建模语句也称为连续赋值语句,用于对线网的赋值,以关键字 assign 作为语法标识出来,其基本语法结构如下:
assign 线网信号名 = 运算表达式;
例如前面的例子中的建模语句都是满足这个结构的:
assign g = (x1 & x3) | (x2 & x4);
assign h = (x1 | ~x3) & (~x2 | x4);
assign f = g | h;
使用数据流级建模是要注意:在等式的左侧出现的一定要是线网类型,即在之前的声明部分定义为wire类型线网名,宽度可以是一位也可以是多位,绝对不能是 reg 类型的寄存器名。 reg 类型是行为级建模语句中使用的,这一点初学者一定要加以区分。
数据流从数据的流动角度来描述整个电路,就像描述一条河流的走向一样,要在哪里转弯,要在哪里分岔,所以大多数情况下它依然离不开基本的电路结构图或逻辑表达式。但是数据流语句的描述重点是数据如何在电路中“流动”,即数据的传输和变化情况,所以体现在描述语句中,重点是在整个电路从输入到输出的过程中,输入信号经过哪些处理或者运算,最终才能得到最后的输出信号。而这些数据的处理过程,就是等式右侧的运算表达式。
运算表达式有两部分组成:操作数和操作符。操作数就是要处理的数据,操作符就是要对这些数据做的处理方式。操作数和操作符的种类都很多,这里就不一一赘述了。
3.视频内容连接:
数据流级建模视频