不恢復余數(shù)除法器

不恢復余數(shù)除法器

基本算法

不恢復余數(shù)除法器的基本算法來自于恢復余數(shù)除法器蛙婴,區(qū)別在于當余數(shù)變負時不停下恢復余數(shù)而是繼續(xù)運行迭代废岂,并在迭代中加上移位后除數(shù)而不是減去移位后除數(shù)死陆,基本算法如下所示

  1. 將除數(shù)向左移位到恰好大于被除數(shù)
  2. 若余數(shù)為正:余數(shù)減去移位后除數(shù)盲厌;若余數(shù)為負:余數(shù)加上移位后除數(shù)燎孟;
  3. 若現(xiàn)余數(shù)為正坚俗,該位結果為1镜盯,否則為0,將除數(shù)向右移位一位
  4. 重復2,3猖败,知道移位后除數(shù)小于原除數(shù)

RTL代碼

module norestore_divider #(
    parameter WIDTH = 4
)(
    input clk,    // Clock
    input rst_n,  // Asynchronous reset active low

    input [WIDTH * 2 - 1:0]dividend,
    input [WIDTH - 1:0]divisor,

    input din_valid,

    output reg[2 * WIDTH - 1:0]dout,
    output [WIDTH - 1:0]remainder
);

// parameter JUDGE = 2 ** (2 * WIDTH);

reg [2 * WIDTH:0]remainder_r;
reg [3 * WIDTH - 1:0]divisor_move;
reg [WIDTH - 1:0]divisor_lock;
reg [2 * WIDTH:0]judge;
always @ (*) begin
    if(remainder_r[2 * WIDTH] == 1'b0) begin
        judge = remainder_r - divisor_move;
    end else begin
        judge = remainder_r + divisor_move;
    end
end

always @ (posedge clk or negedge rst_n) begin
    if(~rst_n) begin
        {remainder_r,divisor_lock,divisor_move,dout} <= 'b0;
    end else begin
        if(din_valid == 1'b1) begin //lock input data
            remainder_r[WIDTH * 2 - 1:0] <= dividend;
            remainder_r[2 * WIDTH] <= 'b0;
            divisor_move[3 * WIDTH - 1:2 * WIDTH] <= divisor;
            divisor_move[2 * WIDTH - 1:0] <= 'b0;
            divisor_lock <= divisor;
            dout <= 'b0;
        end else if((divisor_move > '{remainder_r}) && (dout == 'b0)) begin
         //開始運算條件
            remainder_r <= remainder_r;
            dout <= 'b0;
            divisor_move <= divisor_move >> 1;
            divisor_lock <= divisor_lock;
        end else if(divisor_move >= '{divisor_lock}) begin
            if(remainder_r[2 * WIDTH] == 1'b0) begin
                remainder_r <= judge;
                if(judge[2 * WIDTH] == 'b0) begin
                    dout <= {dout[2 * WIDTH - 2:0],1'b1};
                end else begin
                    dout <= {dout[2 * WIDTH - 2:0],1'b0};
                end
            end else begin
                remainder_r <= judge;
                if(judge[2 * WIDTH] == 'b0) begin
                    dout <= {dout[2 * WIDTH - 2:0],1'b1};
                end else begin
                    dout <= {dout[2 * WIDTH - 2:0],1'b0};
                end
            end
            divisor_move <= divisor_move >> 1;
            divisor_lock <= divisor_lock;
        end else if(remainder_r[2 * WIDTH - 1] == 1'b1) begin
         //調整余數(shù)
            remainder_r <= remainder_r + divisor_lock;
            dout <= dout;
            divisor_lock <= divisor_lock;
            divisor_move <= divisor_move;
        end else begin
            remainder_r <= remainder_r;
            divisor_lock <= divisor_lock;
            divisor_move <= divisor_move;
            dout <= dout;
        end
    end
end

assign remainder = remainder_r[WIDTH - 1:0];

endmodule

測試平臺

module tb_divider (
);

parameter WIDTH = 4;

logic clk;    // Clock
logic rst_n;  // Asynchronous reset active low
logic [2 * WIDTH - 1:0]dividend;
logic [WIDTH - 1:0]divisor;

logic din_valid;

logic [2 * WIDTH - 1:0]dout;
logic [WIDTH - 1:0]remainder;

norestore_divider #(
    .WIDTH(WIDTH)
) dut (
    .clk(clk),    // Clock
    .rst_n(rst_n),  // Asynchronous reset active low

    .dividend(dividend),
    .divisor(divisor),

    .din_valid(din_valid),

    .dout(dout),
    .remainder(remainder)
);

initial begin
    clk = 'b0;
    forever begin
        #50 clk = ~clk;
    end
end

initial begin
    rst_n = 1'b1;
    # 5 rst_n = 'b0;
    #10 rst_n = 1'b1;
end

logic [2 * WIDTH - 1:0]dout_exp;
logic [WIDTH - 1:0]remainder_exp;
initial begin
    {dividend,divisor,din_valid} = 'b0;
    forever begin
        @(negedge clk);
        dividend = (2 * WIDTH)'($urandom_range(0,2 ** (2 * WIDTH)));
        divisor = (WIDTH)'($urandom_range(1,2 ** WIDTH - 1));
        din_valid = 1'b1;

        remainder_exp = dividend % divisor;
        dout_exp = (dividend - remainder_exp) / divisor;

        repeat(5 * WIDTH) begin
            @(negedge clk);
            din_valid = 'b0;
        end
        if((remainder == remainder_exp) && (dout_exp == dout)) begin
            $display("successfully");
        end else begin
            $display("failed");
            $stop;
        end
    end
end

endmodule
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末速缆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子恩闻,更是在濱河造成了極大的恐慌艺糜,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幢尚,死亡現(xiàn)場離奇詭異破停,居然都是意外死亡,警方通過查閱死者的電腦和手機尉剩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進店門真慢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人理茎,你說我怎么就攤上這事黑界。” “怎么了皂林?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵朗鸠,是天一觀的道長。 經常有香客問我础倍,道長烛占,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任沟启,我火速辦了婚禮忆家,結果婚禮上,老公的妹妹穿的比我還像新娘美浦。我一直安慰自己弦赖,他們只是感情好,可當我...
    茶點故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布浦辨。 她就那樣靜靜地躺著蹬竖,像睡著了一般沼沈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上币厕,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天列另,我揣著相機與錄音,去河邊找鬼旦装。 笑死页衙,一個胖子當著我的面吹牛,可吹牛的內容都是我干的阴绢。 我是一名探鬼主播店乐,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呻袭!你這毒婦竟也來了眨八?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤左电,失蹤者是張志新(化名)和其女友劉穎廉侧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篓足,經...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡段誊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了栈拖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片连舍。...
    茶點故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖辱魁,靈堂內的尸體忽然破棺而出烟瞧,到底是詐尸還是另有隱情,我是刑警寧澤染簇,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布参滴,位于F島的核電站,受9級特大地震影響锻弓,放射性物質發(fā)生泄漏砾赔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一青灼、第九天 我趴在偏房一處隱蔽的房頂上張望暴心。 院中可真熱鬧,春花似錦杂拨、人聲如沸专普。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽檀夹。三九已至筋粗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炸渡,已是汗流浹背娜亿。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚌堵,地道東北人买决。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像吼畏,于是被迫代替她去往敵國和親督赤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,606評論 2 350

推薦閱讀更多精彩內容

  • 不恢復余數(shù)除法器 基本算法 不恢復余數(shù)除法器的基本算法來自于恢復余數(shù)除法器宫仗,區(qū)別在于當余數(shù)變負時不停下恢復余數(shù)而是...
    月見樽閱讀 4,368評論 0 0
  • 基于迭代單元的除法器 迭代單元 數(shù)字信號處理中够挂,有大量的算法是基于迭代算法,即下一次的運算需要上一次運算的結果藕夫,將...
    月見樽閱讀 1,100評論 0 0
  • 恢復余數(shù)除法器 算法描述 恢復余數(shù)除法器是一種常用的除法器,過程與手算除法的方法很類似枯冈,過程為 將除數(shù)向左位移直到...
    月見樽閱讀 2,601評論 0 0
  • 8086匯編 本筆記是筆者觀看小甲魚老師(魚C論壇)《零基礎入門學習匯編語言》系列視頻的筆記俗孝,在此感謝他和像他一樣...
    Gibbs基閱讀 37,140評論 8 114
  • 本文是對論文《The Z1: Architecture and Algorithms of Konrad Zuse...
    逸之閱讀 4,303評論 15 12