`timescale 1ns / 1ps
//// company:
// engineer:
// // create date: 2017/08/18 15:20:41
// design name:
// module name: devided
// project name:
// target devices:
// tool versions:
// description:
// // dependencies:
// // revision:
// revision 0.01 - file created
// additional comments:
// //
module devided(
clk,
rst_n,
a,b,
result,
remainder
);input clk;
input rst_n;
input [15:0] a; // 被除數
input [7:0] b; //除數
output reg [15:0] result; // 商
output [7:0] remainder;//餘數
reg [22:0] mid_a ;
reg [2:0] state;
reg [6:0] diff;
reg [4:0] cnt;
always@(posedge clk or negedge rst_n) begin
if(!rst_n)begin
mid_a <= ;
state <= 3'd0;
result <= 16'd0;
diff <= 7'd0;
cnt <= 5'd0;
endelse if( cnt == 5'd16) begin
mid_a <= mid_a;
state <= state ;
result <= result ;
diff <= diff ;
cnt <= cnt;
endelse
case(state)
3'd0:begin
if(mid_a[22:15] < b)begin
state <= 3'd2;
endelse begin
state <= 3'd1;
endend
3'd1:begin
result <= ;
diff <= mid_a[22:15] - b;
state <= 3'd3;
end3'd2:begin
result <= ;
state <= 3'd4;
end3'd3:begin
mid_a <= ;
cnt <= cnt + 5'd1;
state <= 3'd0;
end3'd4:begin
if(mid_a[22]) begin
result <= ;
diff <= mid_a[22:14] - b;
cnt <= cnt +5'd1;
state <= 3'd3;
endelse begin
diff <= mid_a[21:15];
state <= 3'd3;
end
end// 3'd4:begin
// if( ! mid_a)
// result << 1;
// else
// result <= result;
// end
default: state <= 3'd0;
endcase
end
assign remainder = diff;
endmodule
工程所用演算法:計算時先將計算的被除數向前擴充套件7位,隨後由高位向低位逐8位遞減,滾動記錄差值。
首先被減數16位在前邊拼接7位0,拼接後不會改變被除數的大小,而且方便向下操作。拼接後將此23位數稱為mid。之後取mid的高8位與除數作比較,若大於除數,則減去除數,結果低位拼接一。若小於除數,則驗證最高位是不是0,若是則左移一位,結果拼接0.若不是則用高九位減去除數,結果拼接兩個0.然後將差和後15位以及末尾乙個0拼接,實現結果迴圈向前。在計算的同時用計數器計數來確定執行到的位數。在進行以上操作,最終得到結果。
實際演算法和平常做除法豎式原理相同,只是為了速度將一些操作合併在同一時刻進行,加快了運算速度。
資源利用表
**圖state為狀態機的轉移狀態,被除數a為24,b為3,當狀態機執行結束時得到答案8.即result。餘數remainder為0.運算正確。
fpga除法器的設計要點
fpga中除法器的設計 在fpga中除法器可通過位移比較實現,通過觸發器的設計使面積功耗不會因為位數的變化有較大的變動,位數設定最好用引數進行設定這樣可以在上層模組中對位數進行重定義,防止對引腳的浪費。演算法解析 當輸入確認訊號來臨時,商和餘數,及所有暫存器被全部清零,新一輪計算開始,計數器cnt賦...
FPGA實現除法運算
我們用軟體程式設計的時候,用到除法的時候,乙個 這樣的除號就搞定了。但是如果用硬體來實現除法,又是怎麼樣實現的了。計算機儲存的數都是以二進位制數來儲存的,二進位制的除法和我們平常用到十進位制除法是一樣的。輾轉相除法。計算如上圖,從最高位開始計算,如果大於除數,商為1。然後算下一位。直到算到最後一位,...
恢復餘數除法器
恢復餘數除法器是一種常用的除法器,過程與手算除法的方法很類似,過程為 將除數向左位移直到比被除數大 執行被除數減除數操作,得餘數,並將商向左移位1位,空位補1 若餘數大於0,除數向右移位1位。如餘數小於0,餘數加當前除數,商最後一位置0,除數向右移位1位 重複到2,只到除數比最初的除數小 rtl 就...