一、運算規則
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...