(一)组合逻辑的
1、通用加法器
`timescale 1ns/1ps /* 时延单位为1ns,时延精度为1ps */ module adderN #( parameter N=4 )( input [N-1:0] a, input [N-1:0] b, input cin, output cout, output [N-1:0]sum ); assign {cout, sum} = a + b + cin; endmodule
>> #(parameter N = 4,
……
parameter M = 8
)
用来定义本模块的全局变量,可被外部调用的模块改变(类似于C语言的参数设定)
>> localparam
用来定义本模块的全局变量,仅在本模块内有效,目的是提高本模块的可读性
>> a+b+cin 的位宽匹配问题(数据对齐)
若不将其结果赋给某个数,
则表达式中的所有中间结果取最大操作数长度;
若将其结果赋给某个数,如上述代码中,把最大位宽为4bit的逻辑表达式赋给5bit的数据,
则表达式中的所有中间结果取最大操作数且包括左端目标的长度。
等效于:
a+b+cin ≡ { a[N-1], a[N-1:0] } + { b[N-1], b[N-1:0] } + cin;
2、for语法实现最原始乘法器
1 parameter size = 8 ; 2 reg[size-1:0] opa,opb; 3 reg[2*size-1:0]result; 4 5 integer bindex; 6 result=0; 7 for( bindex=0;bindex<size-1;bindex++) 8 if(opb[bindex]==1) result = result + (ops<<(bindex)); 9 end
综合后可发现,for循环内实现的并不是串行多周期执行,是一个全并行的加法器
3、与运算 &
>>if(a==1 && b==0) //逻辑与
>> c = a & b; //二元与
>> b = &a; //一元与
相当于b = (( a[0]&a[1] )&a[2] )&a[3] ;

浙公网安备 33010602011771号