P2P介面Booth乘法器設計

2021-09-21 06:01:52 字數 3589 閱讀 6935

本文首發於個人部落格

booth乘法器是一種使用移位實現的乘法器,實現過程如下,對於乘法:

擴充套件a的位數為n+1位,新增,則a變為:

從i=0開始,到i=n-1結束,依次考察的值,做如下操作:

最後,捨棄r的最右端1位,即獲得

其原理比較容易理解,對於以上乘法,可以分解為:

以上是位移乘法器的原理,那麼對於booth乘法器,新增了一條:

即有:將移位乘法器原理式中連續為1的部分使用兩個減法代替,即形成booth乘法器

這次實現了乙個基於p2p介面的booth乘法器,位寬可配置。

module booth_mul #(

parameter din_width_log = 3

)( input clk, // clock

input rst_n, // asynchronous reset active low

input din_valid,

output din_busy,

input [2 ** din_width_log-1:0] din_data_a,

input [2 ** din_width_log-1:0] din_data_b,

output reg dout_valid,

input dout_busy,

output [2 ** (din_width_log + 1) - 1:0]dout_data

);

首先定義控制流,控制流為乙個狀態機,分別為:

parameter init = 2'b00;

parameter work = 2'b01;

parameter tran = 2'b11;

reg [din_width_log-1:0]shifter_counter;

reg [1:0] status,next_status;

always @(posedge clk or negedge rst_n) begin : proc_status

if(~rst_n) begin

status <= 'b0;

end else begin

status <= next_status;

endendwire is_computed = (shifter_counter == 2 ** din_width_log - 1);

wire is_traned = dout_valid && !dout_busy;

always @(*) begin

case (status)

init:begin

if(din_valid) begin

next_status = work;

end else begin

next_status = init;

endend

work:begin

if(is_computed) begin

next_status = tran;

end else begin

next_status = work;

endend

tran:begin

if(is_traned) begin

next_status = init;

end else begin

next_status = tran;

endend

default : next_status = init;

endcase

endassign din_busy = status[0];

always @(posedge clk or negedge rst_n) begin

if(~rst_n) begin

shifter_counter <= 'b0;

end else if(status == work) begin

shifter_counter <= shifter_counter + 1'b1;

end else begin

shifter_counter <= 'b0;

endendalways @(posedge clk or negedge rst_n) begin

if(~rst_n) begin

dout_valid <= 'b0;

end else if(is_computed) begin

dout_valid <= 1'b1;

end else if(is_traned) begin

dout_valid <= 'b0;

endend

下面是資料流的部分,該部分實現了上述的booth乘法操作

reg [2 ** din_width_log:0]a_data;

wire is_read = !din_busy && din_valid;

always @(posedge clk or negedge rst_n) begin : proc_a_data

if(~rst_n) begin

a_data <= 0;

end else if(is_read) begin

a_data <= ;

end else if(status == work) begin

a_data <= a_data >> 1;

endendreg [2 ** (din_width_log + 1) - 1:0]b_data;

always @(posedge clk or negedge rst_n) begin : proc_b_data

if(~rst_n) begin

b_data <= 0;

end else if(is_read)begin

b_data <= ;

end else if(status == work) begin

b_data <= b_data << 1;

endendreg [2 ** (din_width_log + 1):0]temp_data,result_data;

always @(*) begin

case (a_data[1:0])

2'b01:temp_data = dout_data + b_data;

2'b10:temp_data = dout_data - b_data;

default:temp_data = dout_data;

endcase

endalways @(posedge clk or negedge rst_n) begin : proc_dout_data

if(~rst_n) begin

result_data <= 0;

end else if(is_read) begin

result_data <= 'b0;

end else if(status == work) begin

result_data <= temp_data;

endendassign dout_data = result_data;

endmodule

認識P2P,利用P2P

是peer to peer的縮寫 好象還看到過文章說是point to point,我也不清楚,網上的資料也不清楚,鬱悶 peer在英語裡有 地位 能力等 同等者 同事 和 夥伴 等意義。這樣一來,p2p也就可以理解為 夥伴對夥伴 的意思,或稱為對等聯網。目前人們認為其在加強網路上人的交流 檔案交換...

P2P網路模型

1 靜態配置模型 靜態配置模型是一種相對靜態而簡單的對等點定位模型。在該模型中,每個對等點都確切地知道存在於其p2p 網路中其它對等點的位置以及它們所提供的共享資源內容。缺點 網路無法應付不能預知的隨機事件和臨時變更,比如對等點隨機進入和退出網路。優點 整個網路在外部攻擊面前表現得很穩固。2 動態配...

P2P路由演算法

p2p路由演算法 資源定位方法 dht distributed hash table 演算法 思想 每乙份資源都由一組關鍵字標示,系統對其中的每乙個關鍵字進行hash,根據hash的結果確定該關鍵字由哪個使用者負責儲存,使用者搜尋的同時,用同樣的演算法計算每乙個字的hash,再根據hash知道該關鍵...