在电路设计过程中,Verilog HDL有三种设计方式:数据流建模、行为级建模、结构型建模。更多采用的是数据流建模和行为级建模。
数据流建模就是:连续赋值语句+上一节讲的运算符
连续赋值语句
目标类型
线网类型。
- 标量类型,如 wire a,b;
- 向量类型,如 wire [3:0] a,b;
显式连续赋值语句(建议使用)
信号定义和assign语句分成两条。
<net_declaration><range><name>;
assign #<delay><name><assignment表达式>
例:
module example1_assignment(a,b,m,n,c,y);
input[3:0]a,b,m,n;
output[3:0]c,y;
wire[3:0]a,b,m,n,c,y;
assign y=m|n; //四个或门
assign #(3,2,4)c=a&b; //四个与门
endmodule
隐式连续赋值语句
信号定义和assign语句在一条中。
类似C语言中的int i=0;
<net_declaration><drive_strength><range>#<delay><name>=assignment表达式
例:
module example2_assignment(a,b,m,n,c,y,w);
input[3:0]a,b,m,n;
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(strong0,weak1)[3:0]#(2,1,3)w=(a^b)&(m^n);
endmodule
注意
- 赋值目标只能是线网类型(wire)
- 只要赋值语句右边表达式任何一个变量有变化,表达式立刻被计算,结果立即赋给左边的信号
- 连续赋值语句不能出现在always,initial等过程块中
- 多个连续赋值语句之间是并行的,与位置顺序无关
- 连续赋值语句中的延时具有硬件电路中惯性延时的特性,任何小于其延时的信号变化脉冲都将被滤除掉,不会体现在输出端口上:
数字电路是一个基于MOS的电路,在信号传输过程中,输出信号和输入信号一定有延迟,这种延迟称为硬件电路的延迟,决定了整个电路的工作频率,随着器件的速度越来越快,器件的延迟非常小,电路中的毛刺现象就会被带到输出端。整个电路代表的是一种电容特性(通交流,阻直流),早期的电路延迟很大,相当于电容容抗很大,对快速变化电流的阻碍作用就越强,而现在的电路延迟很小,相当于电容容抗很小,对快速变化电流的阻碍作用就弱,因此毛刺会被带到输出端。
惯性延迟就是指这个毛刺不被带到输出端的最大宽度。如果干扰毛刺宽度大于惯性延迟,这个干扰就会被带到输出端口,如果小于惯性延迟,就会被滤除。