本文首發於個人部落格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知道該關鍵...