结构化建模
将硬件电路描述成一个分级子模块系统,通过组曾调用子模块构成功能复杂的
(1)模块实例语句
基本语法:模块名<参数值列表><实例名>(端口关联列表)
参数值列表:可选项,将参数值传递给被吊桶的模块实例。如,被调用模块的parameter参数可在实例化时被修改
两种关联方式:
-
端口位置关联:(信号名与端口列表位置对应)
-
端口名称关联:( .端口名(信号名))
表达式只能连接到输入端口,且存在隐形的赋值关系,位宽不匹配时则可能有高位截断或补零
(2)门实例语句
语法格式: 门类型关键词<实例名>(端口列表):
e.g. and (out ,in1, in2)
and 与门 or 或门 nand与非门 nor或非门 xnor同或门 xor异或门 not反相器
Attention:同一级代码是并行执行
全加器:
module fullAdder(a,b,cin,sum,cout);
input a,b,cin;
output sum,cout;
wire S1,T1,T2;
xor X1(S1,a,b);
and A1(T1,a,b);
A2(T2,S1,cin);
endmodule
数据流建模
利用assign制定表达式驱动线网(wire型),是描述数据在寄存器之间的流动和处理过程的一种建模方式,主要用于组合逻辑电路设计
assign sum=a^b^cin;
assign cout=(a&b)|(cin&(a^b))
但是还是主要用于较简单的逻辑电路
行为级建模
通过描述电路的行为来实现建模,关心电路功能而非具体内部构成,是对电路系统的稿酬相机描述,用一系列高级描述语句编写的并行、动态的过程块来描述系统工作。
(1)过程块
initial 块只执行一次,不可综合
always块,循环执行
串行:begin end
并行:fork
always @(<敏感事件列表>)
begin
语句1;
语句2;
end
(2)过程赋值语句
-
阻塞赋值 “=”
阻塞赋值主要指在串行语句块中,代码的赋值是串行进行的,即通c++,python,matlab中代码执行一样,一行一行的执行(一行一行的进行赋值)。例如一个比较典型的 begin end 语句
always @(posedge clk)
begin
q1=d;
q2=q1;
end
在这个代码中先将d赋值给q1,再将q1赋值给q2,所以最后的输出是q1=q2=d。
- 非阻塞赋值
在串行语句中,并行执行各语句后再统一赋值
always @(posedge clk)
begin
q1<=d;
q2<=q1;
end
我们得到的结果就是q1=d,q2赋值为上一时刻q1的值。q2不一定就等于d。
综上所述,阻塞赋值和非阻塞赋值是有很大区别的。
(3)条件语句:if 语句和 case 语句
if ;
else if ;
else if ;
else;
if 语句与python的elif有一点区别
-
当if需要判断的条件比较多的时候,那么使用case语句更方便直观。(case 也是可以嵌套使用的)
case(conditions) value1:语句块1 value2:语句块2 ... default:语句块n+1 endcase
(4)循环语句
-
repeat:确定循环次数执行
具体用法为:repeat(次数表达式) -
while:括号内表达式成真则执行
具体用法为:while(表达式) -
forever:一直执行
-
for:同c语言中for循环的用法
具体用法为:for(循环变量赋初值;循环结束条件;循环变量计算)提醒:所有语句中只有for循环时可以综合的。