国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

verilog實現(xiàn)除法器運算

這篇具有很好參考價值的文章主要介紹了verilog實現(xiàn)除法器運算。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

verilog實現(xiàn)除法器運算

本文通過verilog實現(xiàn)了一個位寬參數(shù)可配置的除法運算模塊

1, 設計思路

我們要計算 a_data/b_data = div_data ----remain_data;

  • ?? 確定位寬:若a_data的位寬為A_WIDTH, b_data的位寬為B_WIDTH;則div_data的最大位寬為A_WIDTH, remain_data的位寬為B_WIDTH;

  • ?? 計算div_data的最高位:若a_data >= (b_data<<(A_WIDTH-1)), 則div_data的最高位div_data[A_WIDTH-1]為1,否則div_data[A_WIDTH-1]為0; 即div_data[A_WIDTH-1] = a_data > (b_data<<(A_WIDTH-1)) ? 1‘b1 : 1’b0;

  • ?? 計算div_data的次高位:若div_data的最高位div_data[A_WIDTH-1]為1,則a_data_tmp = a_data – (b_data<<(A_WIDTH-1)); 否則a_data_tmp = a_data; 次高位div_data[A_WIDTH-2] = a_data_tmp >= (b_data<<(A_WIDTH-2)) ? 1‘b1 : 1’b0;

  • ?? 依次類推,可 計算出完整的div_data;

  • ??. 計算完div_data后,可用 remain_data = a_data – b_data*div_data獲取余數(shù)

舉個例子,計算8/3 也就是 4’b1000/3’b011 = 3’b010;

  • ?? div_data[3] = 4’b1000 > (3’b011 << 3) ? 1’b1 : 1’b0 ; 由于div_data[3]為0,所以a_data_tmp為4‘b1000;

  • ?? div_data[2] = 4’b1000 > (3’b011 << 2) ? 1’b1 : 1’b0; 由于div_data[2]為0,所以a_data_tmp為4‘b1000;

  • ?? div_data[1] = 4’b1000 > (3’b011 << 1) ? 1’b1 : 1’b0; 由于div_data[1]為1,所以a_data_tmp為4‘b1000-(3’b011 << 1) = 4’b0010;

  • ?? div_data[0] = 4’b0010 > (3’b011 << 0) ? 1’b1 : 1’b0;

  • ??所以 div_data = 4‘b0010 = 2;

  • ?? remain_data = a_data – b_data*div_data = 8 – 3 * 2 = 2 = 3’b010;

2, Verilog代碼

// Filename      : div.v
// Author        : ppkuan
module div(/*autoarg*/
    //Inputs
    clk, rst_n, in_vld, a_data, b_data, 

    //Outputs
    out_vld, remain_data, div_data
);

parameter   A_WIDTH = 10;
parameter   B_WIDTH = 5;
// a_data/b_data = div_data------remain_data

input                             clk         ;
input                             rst_n       ;
input                             in_vld      ;
input       [A_WIDTH - 1 : 0]     a_data      ;
input       [B_WIDTH - 1 : 0]     b_data      ;

output reg                        out_vld     ;
output reg  [B_WIDTH - 1 : 0]     remain_data ;
output reg  [A_WIDTH - 1 : 0]     div_data    ;


wire   [A_WIDTH - 1 : 0]                             div_data_tmp    ;
wire   [A_WIDTH - 1 : 0] [A_WIDTH + B_WIDTH - 1 : 0] ab_data_tmp     ;
wire   [A_WIDTH - 1 : 0] [A_WIDTH - 1 : 0]           a_data_tmp      ; 
wire   [B_WIDTH - 1 : 0]                             remain_data_tmp ;

assign  ab_data_tmp[A_WIDTH - 1]   = b_data << (A_WIDTH - 1);
assign  div_data_tmp[A_WIDTH - 1]  = {{B_WIDTH{1'b0}}, a_data} >= ab_data_tmp[A_WIDTH - 1] ? 1'b1 : 1'b0;
assign  a_data_tmp[A_WIDTH - 1]    = div_data_tmp[A_WIDTH - 1] ? {{B_WIDTH{1'b0}},a_data} - ab_data_tmp[A_WIDTH - 1] : a_data;

genvar i;
generate 
    for(i = A_WIDTH - 2; i >= 0; i--)
        begin:div
            assign ab_data_tmp[i]  = (b_data << i);
            assign div_data_tmp[i] = {{B_WIDTH{1'b0}}, a_data_tmp[i+1]} >= ab_data_tmp[i] ? 1'b1 : 1'b0;
            assign a_data_tmp[i]   = div_data_tmp[i] ? {{B_WIDTH{1'b0}},a_data_tmp[i+1]} - ab_data_tmp[i] : a_data_tmp[i + 1];
        end
endgenerate

assign remain_data_tmp = {{B_WIDTH{1'b0}}, a_data} - div_data_tmp * b_data;

always@(posedge clk or negedge rst_n)
    if(!rst_n)
    begin
        out_vld     <= 'b0            ;
        remain_data <= 'd0            ;
        div_data    <= 'd0            ;
    end
    else if(in_vld)
    begin
        out_vld     <= 'b1            ;
        remain_data <= remain_data_tmp;
        div_data    <= div_data_tmp   ;
    end
    else 
    begin
        out_vld     <= 'b0            ;
    end
endmodule

3, 測試用例:

module test;

wire         clk         ;
wire         rst_n       ;
wire         in_vld      ;
wire [9 : 0] a_data      ;
wire [4 : 0] b_data      ;
wire         out_vld     ;
wire [9 : 0] div_data    ;
wire [4 : 0] remain_data ;

reg         clk_r       ;
reg         rst_n_r     ;
reg         in_vld_r    ;
reg [9 : 0] a_data_r    ;
reg [4 : 0] b_data_r    ;
 
assign clk    = clk_r    ;
assign rst_n  = rst_n_r  ;
assign in_vld = in_vld_r ;
assign a_data = a_data_r ;
assign b_data = b_data_r ;

div#(
    .A_WIDTH(10),
    .B_WIDTH(5)) 
    u_div(/*autoinst*/
    // a_data/b_data = div_data------remain_data

    .clk                            (clk                                        ), // input 
    .rst_n                          (rst_n                                      ), // input 
    .in_vld                         (in_vld                                     ), // input 
    .a_data                         (a_data[9 : 0]                              ), // input 
    .b_data                         (b_data[4 : 0]                              ), // input 

    .out_vld                        (out_vld                                    ), // output
    .remain_data                    (remain_data[4 : 0]                         ), // output
    .div_data                       (div_data[9 : 0]                            )  // output
);

initial
begin
clk_r =    0;
in_vld_r = 0;
rst_n_r =  1;
#10
rst_n_r =  0;
#10
rst_n_r =  1;
#10
in_vld_r = 1;
a_data_r = 10'd57;
b_data_r = 5'd8;
#10
in_vld_r = 0;
$finish;
end

always #5 clk_r = !clk_r;

endmodule

測試結果如圖所示

verilog實現(xiàn)除法器運算

57/8 = 7—1;計算正確;文章來源地址http://www.zghlxwxcb.cn/news/detail-463586.html

到了這里,關于verilog實現(xiàn)除法器運算的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Verilog實現(xiàn)超前進位加法器

    Verilog實現(xiàn)超前進位加法器

    在CPU等對性能要求較高的電路中,一般都會采用超前進位加法器,因為超前進位加法器的延時相對來說比較小。下面講述超前進位加法器的原理: 我們知道,一個三輸入,二輸出的全加器,其邏輯關系為 S = A ⊕ B ⊕ C i n S=Aoplus Boplus C_{in} S = A ⊕ B ⊕ C in ? C o u t = ( A B ) ∣

    2023年04月08日
    瀏覽(17)
  • 數(shù)字IC經(jīng)典電路(1)——經(jīng)典加法器的實現(xiàn)(加法器簡介及Verilog實現(xiàn))

    數(shù)字IC經(jīng)典電路(1)——經(jīng)典加法器的實現(xiàn)(加法器簡介及Verilog實現(xiàn))

    加法器是數(shù)字系統(tǒng)最基礎的計算單元,用來產(chǎn)生兩個數(shù)的和,加法器是以二進制作運算。負數(shù)可用二的補數(shù)來表示,減法器也是加法器,乘法器可以由加法器和移位器實現(xiàn)。加法器和乘法器由于會頻繁使用,因此加法器的速度也影響著整個系統(tǒng)的計算速度。對加法器的設計也

    2024年02月14日
    瀏覽(22)
  • 數(shù)字IC經(jīng)典電路(2)——經(jīng)典乘法器的實現(xiàn)(乘法器簡介及Verilog實現(xiàn))

    數(shù)字IC經(jīng)典電路(2)——經(jīng)典乘法器的實現(xiàn)(乘法器簡介及Verilog實現(xiàn))

    數(shù)字電路中乘法器是一種常見的電子元件,其基本含義是將兩個數(shù)字相乘,并輸出其乘積。與加法器不同,乘法器可以實現(xiàn)更復雜的運算,因此在數(shù)字電路系統(tǒng)中有著廣泛的應用。 乘法器的主要用途是在數(shù)字信號處理、計算機科學以及其他數(shù)字電路應用中進行精確的數(shù)字乘法

    2024年02月06日
    瀏覽(102)
  • verilog編程之乘法器的實現(xiàn)

    verilog編程之乘法器的實現(xiàn)

    知識儲備 首先來回顧一下乘法是如何在計算機中實現(xiàn)的。 假設現(xiàn)在有兩個32位帶符號定點整數(shù)x和y,我們現(xiàn)在要讓x和y相乘,然后把乘積存放在z中,大家知道,兩個32位數(shù)相乘,結果不會超過64位,因此z的長度應該為64位。 z = x * y中,x是被乘數(shù),在Verilog代碼中 multiplicand表示

    2024年04月12日
    瀏覽(23)
  • 用加法器實現(xiàn)補碼的加/減運算

    用加法器實現(xiàn)補碼的加/減運算

    目錄 1.原碼的加減運算 (1)原碼的加/減法運算 (2)溢出判斷 (3)符號擴展 2.加法器原理 3.加法器實現(xiàn)補碼的加減運算 1.原碼的加減運算 (1)原碼的加/減法運算 正+正---絕對值做加法,結果為正 負+負---絕對值做加法,結果為負 正+負---絕對值大的減絕對值小的,符號同絕

    2024年01月18日
    瀏覽(19)
  • FPGA流水線除法器(Verilog)原理及實現(xiàn)

    FPGA流水線除法器(Verilog)原理及實現(xiàn)

    ??除法器的計算過程如下圖所示。 假設數(shù)值的位寬為N。 Step1:分別將被除數(shù)和除數(shù)擴展至原來2倍位寬(2N),被除數(shù)在其左邊補N位0,除數(shù)在其右邊補N位0; Step2:將被除數(shù)依次左移(每次左移1位),末位補數(shù)值(該數(shù)值為被除數(shù)高N位與除數(shù)高N位的商),高N位為被除數(shù)高

    2024年02月11日
    瀏覽(26)
  • 各種加法器的比對分析與Verilog實現(xiàn)(2)

    各種加法器的比對分析與Verilog實現(xiàn)(2)

    ? ? ? 本文將介紹Kogge-Stone加法器和brent-kung加法器的原理,在下一篇博客中我將用Verilog進行實現(xiàn)。 目錄 1. 并行前綴加法器(Parallel-Prefix Adder, PPA)? 2. Kogge-Stone加法器原理 3. brent-kung加法器原理 ???????為了減少AND門的深度,PPA對CLA進行了進一步優(yōu)化。不過PPA和CLA進行的計算

    2024年02月07日
    瀏覽(25)
  • verilog數(shù)組的定義、轉換和加法器的實現(xiàn)

    verilog數(shù)組的定義、轉換和加法器的實現(xiàn)

    看了別人的博客有的人也稱reg [31:0] add0[0:12]這樣的數(shù)組為二維數(shù)組,其實中二維數(shù)組不是真正意義上的數(shù)組,而是由多個寄存器組成的ROM或者RAM。我覺得這樣理解好記一點:這個是一維數(shù)組,一共有0到12共13組數(shù)據(jù),每組數(shù)據(jù)的寬度是0到31一共32個位寬。 優(yōu)勢:簡單易于編程

    2024年02月11日
    瀏覽(21)
  • 各種加法器的比對分析與Verilog實現(xiàn)(1)

    各種加法器的比對分析與Verilog實現(xiàn)(1)

    ????????接下來幾篇博客,我將介紹常見的幾種加法器設計,包括超前進位、Kogge-Stone、brent-kung、carry-skip、Conditional-Sum等加法器的原理及Verilog實現(xiàn)。 ???????本文將介紹行波進位加法器、超前進位加法器的原理及Verilog實現(xiàn)。 1.1 原理 ???????從下方原理圖即可看出,

    2024年02月08日
    瀏覽(17)
  • Verilog實現(xiàn)四位加/減法器(邏輯表達式)

    Verilog實現(xiàn)四位加/減法器(邏輯表達式)

    ??起因是老師要我們以邏輯表達式的形式交作業(yè),強調(diào)是邏輯表達式,在網(wǎng)上找了許久,沒有找到,便從一些文章中找到了靈感,特分享 說明: 此代碼為四位加/減法器的Verilog代碼實現(xiàn)(用的是邏輯表達式) 第一種表達: 第二種表達: 這是上面的波形圖 參考鏈接: 原碼

    2024年02月11日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包