FPGA 設計乙個原碼一位乘法器

2021-10-07 03:26:40 字數 3349 閱讀 2258

一、運算規則

x*y=p

引入部分積的概念,每次y的一位和x相乘的結果叫做部分積 ,每次相乘後需要右移一位,再處理y下一位的數值

1.符號位單獨計算(異或運算)

符號組合就4種(00.01.11.10);異或運算即相同為0,不同為1

2.被乘數x 和乘數y 都取絕對值計算

3.一般把被乘數x取雙符號位,並且讓部分積初始值為0,長度與被乘數x相同

4.從乘數y的最後一位開始到第一位分別於被乘數x相乘。

當y當前位數值為1時,部分積加上 |x| (x的絕對值)

當y當前位數值為0時,部分積加上 0

5.每次右移一位時,在最前面補0.

二、兩個例子

三、設計原始碼(verilog)

module array_multiplier(clk,rst_n,mul_x,mul_y,res );

input clk ;//系統時鐘

input rst_n ;//復位訊號

input [3:0] mul_x ;//被乘數

input [3:0] mul_y ;//乘數

output reg [7:0] res ;//結果

reg [3:0] mul_p ;//部分積

reg c ;//進製訊號

reg [3:0] mul_y0 ;//儲存乘數

reg en ;//使能訊號

//使能訊號模組

always@(posedge clk or negedge rst_n)begin

if(rst_n1』b0)begin

en<=1』b0;

endelse if(mul_x1』b0||mul_y1』b0)begin

en<=1』b0;

endelse if(cnt8』d3)begin

en<=1』b1;

endelse begin

en<=en;

endend

//邏輯控制模組(計數)

reg [7:0] cnt;

always@(posedge clk or negedge rst_n)begin

if(rst_n1』b0)begin

cnt<=1』b0;

endelse if(en1』b1)begin

cnt<=8』d0;

endelse if(cnt8』d3)begin

cnt<=8』d0;

endelse begin

cnt<=cnt+1』b1;

endend

//邏輯控制模組(加)

reg con_add_en;

always@(*)begin

if(en1』b1)begin

con_add_en=1』b1;

endelse if(mul_y0[0]1』b1)begin

con_add_en=1』b0;

end

else begin

con_add_en=1』b1;

endend

always@(posedge clk or negedge rst_n)begin

if(rst_n1』b0)begin

mul_p=1』b0;

c=1』b0;

mul_y0=mul_y;

endelse if(en1』b1)begin

mul_p=mul_p;

mul_y0=mul_y0;

endelse if(con_add_en1』b0)begin

=mul_x[3:0]+;

=>>1;

endelse begin

=>>1;

endend

always@(posedge clk or negedge rst_n)begin

if(rst_n1』b0)begin

res<=1』b0;

endelse if(mul_x1』b0||mul_y1』b0)begin

res<=1』b0;

endelse if(en1』b1)begin

res<=;

endelse begin

res<=res;

endend

endmodule

四、test檔案(根據自己需求寫的**檔案)

`timescale 1ns / 1ps

//// company:

// engineer:

//// create date: 2020/06/11 20:07:06

// design name:

// module name: test

// project name:

// target devices:

// tool versions:

// description:

//// dependencies:

//// revision:

// revision 0.01 - file created

// additional comments:

////

module test();

reg clk;

reg rst_n;

reg [3:0] mul_x;

reg [3:0] mul_y;

wire [7:0] res;

initial begin

clk = 0;

rst_n = 0;

#100;

rst_n =1;

endalways #20 clk = ~clk;

initial begin

mul_x = 4』b0000;

mul_y = 4』b0000;

#50 mul_x = 4』b1101;

mul_y = 4』b1011;

endarray_multiplier u_multiply(

.clk(clk),

.rst_n(rst_n),

.mul_x(mul_x),

.mul_y(mul_y),

.res(res)

);endmodule

五、**結果

一種定點原碼一位乘法器的設計與實現

摘要 基於計算機組成原理課程實踐環節的建設,以提高學生實踐技能為目的,總結教學經驗,應用數位電路設計方法與技巧,考慮可行性,設計一種定點原碼一位乘法器的實現方案,包含初始化資料,啟動 停止運算,顯示運算過程等功能,用以指導教學實踐。乘法器 定點原碼一位乘法 計算機組成原理 計算機組成與結構 一 引言...

原碼一位乘法

1.手算乘法 鋪墊 例子 13 11 143 被乘數不動,從乘數最低位開始,每一位乘上被乘數,將所得的結果 部分積 記下,再從比最低位高一位的數字開始如上迴圈,直至乘數的最高位也計算完畢。最終將每一豎列的數值相加即可得出結果。按照我們小學所學的乘法計算公式應該如上圖所示沒有問題,我們教科書裡說的原碼...

原碼一位乘法和補碼一位乘法

原碼乘法遵循的規則如下 比如 a 0.1101,b 0.1011,求a b的積?詳細計算過程如下圖 符號位與符號進行計算.a的符號位為 1,b的符號位為 1.兩個符號進行異或運算最後的符號仍然是 1.數值位乘以數值位.a 0.1101,b 0.1011.我們採用雙符號位來進行計算.a 00.1101...