(一)组合逻辑的

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
View Code

>> #(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 = 82 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] ;

 

posted @ 2020-05-11 17:22  gmh1996  阅读(223)  评论(0)    收藏  举报