常见面试笔试题-verilog程序库Word下载.docx
《常见面试笔试题-verilog程序库Word下载.docx》由会员分享,可在线阅读,更多相关《常见面试笔试题-verilog程序库Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
inputcin;
output[3:
0]sum;
outputcout;
assign {cout,sum}=a+b+cin;
endmodule
补码不仅可以执行正值和负值转换,其实补码存在的意义,就是避免计算机去做减法的操作。
1101-3补
+10008
01015
假设-3+8,只要将-3转为补码形式,亦即0011=>
1101,然后和8,亦即1000相加
就会得到5,亦即0101。
至于溢出的最高位可以无视掉。
乘法器
modulemult(outcome,a,b);
parameterSIZE=8;
input[SIZE:
1]a,b;
outputreg[2*SIZE:
1]outcome;
integeri;
always@(aorb)
beginoutcome<
=0;
for(i=0,i<
=SIZE;
i=i+1)
if(b[i])outcome<
=outcome+(a<
<
(i-1));
end
另一种乘法器。
在初始化之际,取乘数和被乘数的正负关系,然后取被乘数和乘数的正值。
输出结果根据正负关系取得。
elseif(Start_Sig)
case(i)
0:
begin
isNeg<
=Multiplicand[7]^Multiplier[7];
Mcand<
=Multiplicand[7]?
(~Multiplicand+1'
b1):
Multiplicand;
Mer<
=Multiplier[7]?
(~Multiplier+1'
Multiplier;
Temp<
=16'
d0;
i<
=i+1'
b1;
end
1:
//Multipling
if(Mer==0)i<
elsebeginTemp<
=Temp+Mcand;
Mer<
=Mer-1'
end
2:
beginisDone<
=1'
i<
end
3:
b0;
=2'
endcase
assignDone_Sig=isDone;
assignProduct=isNeg?
(~Temp+1'
Temp;
endmodule
booth乘法器
modulebooth_multiplier_module
(
inputCLK,
inputRSTn,
inputStart_Sig,
input[7:
0]A,
0]B,
outputDone_Sig,
output[15:
0]Product,
output[7:
0]SQ_a,
0]SQ_s,
output[16:
0]SQ_p
);
reg[3:
0]i;
reg[7:
0]a;
//resultofA
0]s;
//reverseresultofA
reg[16:
0]p;
//p空间,16+1位
0]X;
//指示n次循环
regisDone;
always@(posedgeCLKornegedgeRSTn)
if(!
RSTn)
begin
i<
=4'
a<
=8'
s<
p<
=17'
X<
isDone<
end
elseif(Start_Sig)
case(i)
0:
begina<
=A;
s<
=(~A+1'
b1);
p<
={8'
d0,B,1'
b0};
end
1:
if(X==8)beginX<
=i+4'
d2;
elseif(p[1:
0]==2'
b01)beginp<
={p[16:
9]+a,p[8:
0]};
b10)beginp<
9]+s,p[8:
elsei<
//00和11,无操作
2:
beginp<
={p[16],p[16:
1]};
X<
=X+1'
=i-1'
end//右移,最高位补0or1.
3:
beginisDone<
4:
endcase
assignDone_Sig=isDone;
assignProduct=p[16:
1];
endmodule
除法器
moduledivider_module
inputCLK,
inputRSTn,
inputStart_Sig,
input[7:
0]Dividend,
0]Divisor,
outputDone_Sig,
output[7:
0]Quotient,
0]Reminder,
reg[3:
reg[7:
0]Dend;
0]Dsor;
reg[7:
0]Q;
0]R;
regisNeg;
regisDone;
always@(posedgeCLKornegedgeRSTn)
if(!
begin
i<
Dend<
Dsor<
Q<
isNeg<
isDone<
end
elseif(Start_Sig)
case(i)
begin
Dend<
=Dividend[7]?
~Dividend+1'
b1:
Dividend;
Dsor<
=Divisor[7]?
Divisor:
(~Divisor+1'
isNeg<
=Dividend[7]^Divisor[7];
end
if(Divisor>
Dend)
beginQ<
=isNeg?
(~Q+1'
Q;
elsebeginDend<
=Dend+Dsor;
Q<
=Q+1'
2:
beginisDone<
3:
endcase
assignQuotient=Q;
assignReminder=Dend;
endmodule
除法器2
modulediv(a,b,clk,result,yu)
input[3:
outputreg[3:
0]result,yu;
inputclk;
reg[1:
0]state;
reg[3:
0]m,n;
paramete