一、设计目的
二、运算电路设计例一
要实现HDL描述的电路图:
X[3:0]的数据直接传送到a[3:0],M1或M0控制Y[3:0]的数据是否取反.若M1打开,M2打开,M0关闭,这时Y[3:0]中的数据取反加一。
f[3:0]中的数据是a[3:0]与b[3:0]中的数据相加得到的。
该运算器可以实现多种运算功能。
实现代码:
wire M = S[11];//M2
wire M_0=S[9];
wire M_1=S[10];
//wire M3=S[12];
//wire Cin=S[8];
//wire SR=S[15];
//wire SV=S[14];
//wire SL=S[13];
wire [3:0] X = S[7:4];
wire [3:0] Y = S[3:0];
/************* The logic of this experiment *************/
wire [3:0] A,B,F;
wire C0,M0,M1;
assign M0=M_0;
assign M1=M_1;
assign C0=M;
wire sign, zero, overflow, carryOut;
assign A[3:0]=X[3:0];
assign B[3]=Y[3] &M0 |!Y[3] &M1;
assign B[2]=Y[2] &M0 |!Y[2] &M1;
assign B[1]=Y[1] &M0 |!Y[1] &M1;
assign B[0]=Y[0] &M0 |!Y[0] &M1;
/****** Internal signal assign to output port *******/
assign L[3:0] = B[3:0];
assign L[7:4] = A[3:0];
assign L[12:9] = F;
assign L[26] = C0;
assign L[21:18] = {sign, zero, overflow, carryOut};
三、运算器电路设计例二
本例需要用Verilog HDL描述的电路如下所示
按照与或门门关系写出输出a3a2a1a0、b3b2b1b0、C0的表达式
以a3a2a1a0的输出表达式为例可写出如下形式
输入 | 输出表达式 |
---|---|
X[3] | SR and X[3] or X[3] and SV or SL and X[2] |
X[2] | SR and X[3] or X[2] and SV or SL and X[1] |
X[1] | SR and X[2] or X[1] and SV or SL and X[0] |
X[1] | SR and X[1] or X[0] and SV or SL and 1’b0 |
可归纳为:
a3a2a1a0 = {4{SR}} & {X[3],X[3],X[2],X[1]} | {X[3],X[3],X[1],X[0]} & {4{SV}} | {4{SL}} & {X[2],X[1],X[0],1’b0}
其中&代表and,|表示or。
同理可得
b3b2b1b0 = {4{M0} & Y[3:0]} |{4{M1}} & !Y[3:0]
真值表:
实现功能 | 功能描述 | SR | SV | SL | M3 | M2 | M1 | M0 |
---|---|---|---|---|---|---|---|---|
F=0 | ||||||||
F=X | 传送X | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
F=Y | 传送Y | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
F=X+Y | 加法 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
F=X-Y | 减法 | |||||||
F=X+1 | 加1 | |||||||
F=X-1 | 减1 | |||||||
F=X/2 | 右移 | |||||||
F=2X | 左移 | |||||||
F=X+Y+Cin | 带进位加法 | |||||||
F=X-Y-Cin | 带借位减法 |
实现代码如下
wire M = S[11];//M2
wire M_0=S[9];
wire M_1=S[10];
wire M3=S[12];
wire Cin=S[8];
wire SR=S[15];
wire SV=S[14];
wire SL=S[13];
wire [3:0] X = S[7:4];
wire [3:0] Y = S[3:0];
/************* The logic of this experiment *************/
wire [3:0] A,B,F;
wire C0,M0,M1;
assign M0=M_0;
assign M1=M_1;
assign C0 = ( Cin & M3 | M);
wire sign, zero, overflow, carryOut;
assign A[3]=SR & X[3] | X[3] & SV | SL &X[2] ;
assign A[2]=SR & X[3] | X[2] & SV | SL &X[1];
assign A[1]=SR & X[2] | X[1] & SV | SL &X[0] ;
assign A[0]=SR & X[1] | X[0] & SV | SL &1'b0 ;
assign B[3] =(M0 & Y[3]) | (M1 & !Y[3]) ;
assign B[2] =M0 & Y[2] | M1 & !Y[2] ;
assign B[1] =M0 & Y[1] | M1 & !Y[1] ;
assign B[0] =M0 & Y[0] | M1 & !Y[0] ;
assign {carryOut,F[3:0]} = A + B + C0;
assign sign = F[3];
assign zero = (F==0) ? 1 : 0; // ~|F;
assign overflow = (~A[3]) & ~B[3] & F[3] | (A[3]) & B[3] & ~F[3] ;
/****** Internal signal assign to output port *******/
assign L[3:0] = B[3:0];
assign L[7:4] = A[3:0];
assign L[12:9] = F;
assign L[26] = C0;
assign L[21:18] = {sign, zero, overflow, carryOut};