資源描述:
《串行乘法器與并行乘法器的設(shè)計》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、串行乘法器與并行乘法器的設(shè)計法器的VerilogHDL實(shí)現(xiàn)博客分類:FPGA1.串行乘法器兩個N位二進(jìn)制數(shù)x、y的乘積用簡單的方法計算就是利用移位操作來實(shí)現(xiàn)。對應(yīng)的HDL代碼為:Java代碼modulemulti_CX(clk,x,y,result);inputclk;input[7:0]x,y;output[15:0]result;reg[15:0]result;parameters0=0,s1=1,s2=2;reg[2:0]count=0;reg[1:0]state=0;reg[15:0]P,T;reg[7:0]y_reg;a
2、lways@(posedgeclk)begincase(state)s0:begincount<=0;P<=0;y_reg<=y;T<={{8{1'b0}},x};state<=s1;ends1:beginif(count==3'b111)state<=s2;elsebeginif(y_reg[0]==1'b1)P<=P+T;elseP<=P;y_reg<=y_reg>>1;T<=T<<1;count<=count+1;state<=s1;endends2:beginresult<=P;state<=s0;enddefault:;
3、endcaseendendmodulemodulemulti_CX(clk,x,y,result);inputclk;input[7:0]x,y;output[15:0]result;reg[15:0]result;parameters0=0,s1=1,s2=2;reg[2:0]count=0;reg[1:0]state=0;reg[15:0]P,T;reg[7:0]y_reg;always@(posedgeclk)begincase(state)s0:begincount<=0;P<=0;y_reg<=y;T<={{8{1'b0
4、}},x};state<=s1;ends1:beginif(count==3'b111)state<=s2;elsebeginif(y_reg[0]==1'b1)P<=P+T;elseP<=P;y_reg<=y_reg>>1;T<=T<<1;count<=count+1;state<=s1;endends2:beginresult<=P;state<=s0;enddefault:;endcaseendendmodule對應(yīng)的功能仿真圖為:乘法功能是正確的,但計算一次乘法需要8個周期。因此可以看出串行乘法器速度比較慢、時延大,但這種
5、乘法器的優(yōu)點(diǎn)是所占用的資源是所有類型乘法器中最少的,在低速的信號處理中有著廣泛的應(yīng)用。疑問:功能仿真圖顯示延遲不止8個時鐘周期,不知道是為什么?。。。2.流水線乘法器一般的快速乘法器通常采用逐位并行的迭代陣列結(jié)構(gòu),將每個操作數(shù)的N位都并行地提交給乘法器。但是一般對于FPGA來講,進(jìn)位的速度快于加法的速度,這種陣列結(jié)構(gòu)并不是最優(yōu)的。所以可以采用多級流水線的形式,將相鄰的兩個部分乘積結(jié)果再加到最終的輸出乘積上,即排成一個二叉樹形式的結(jié)構(gòu),這樣對于N位乘法器需要lb(N)級來實(shí)現(xiàn)。下面是用VerilogHDL實(shí)現(xiàn)一個4位的流水線乘法器:
6、Java代碼modulemulti_4bits_pipelining(mul_a,mul_b,clk,rst_n,mul_out);input[3:0]mul_a,mul_b;inputclk;inputrst_n;output[7:0]mul_out;reg[7:0]mul_out;reg[7:0]stored0;reg[7:0]stored1;reg[7:0]stored2;reg[7:0]stored3;reg[7:0]add01;reg[7:0]add23;always@(posedgeclkornegedgerst_n)
7、beginif(!rst_n)beginmul_out<=0;stored0<=0;stored1<=0;stored2<=0;stored3<=0;add01<=0;add23<=0;endelsebeginstored0<=mul_b[0]?{4'b0,mul_a}:8'b0;stored1<=mul_b[1]?{3'b0,mul_a,1'b0}:8'b0;stored2<=mul_b[2]?{2'b0,mul_a,2'b0}:8'b0;stored3<=mul_b[3]?{1'b0,mul_a,3'b0}:8'b0;add0
8、1<=stored1+stored0;add23<=stored3+stored2;mul_out<=add01+add23;endendendmodule