欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Verilog語言編寫FIR濾波器

FPGA之家 ? 來源:FPGA探索者 ? 作者:FPGA探索者 ? 2022-08-14 09:01 ? 次閱讀

有符號(hào)數(shù)的計(jì)算在 Verilog中是一個(gè)很重要的問題(也很容易會(huì)被忽視),在使用 Verilog 語言編寫 FIR 濾波器時(shí),需要涉及到有符號(hào)數(shù)的加法和乘法,在之前的程序中我把所有的輸入輸出和中間信號(hào)都定義成有符號(hào)數(shù),這樣在計(jì)算時(shí)沒有出現(xiàn)問題(實(shí)際在之前的程序中遇到了問題,最后濾波結(jié)果不對(duì),博客的程序是已經(jīng)改正過的),下面實(shí)際試驗(yàn)一下 Verilog 的乘法問題;

1.編寫程序測(cè)試無符號(hào)數(shù)和有符號(hào)數(shù)的乘法

編寫程序如下,其中,乘法的兩個(gè)乘數(shù)分別是無符號(hào)、有符號(hào)的四種組合,輸出的積也是分為無符號(hào)和有符號(hào),共計(jì) 8 種可能;

module signed_test(    input           [7:0]   data_in_unsigned_1,    input           [7:0]   data_in_unsigned_2,
    input   signed  [7:0]   data_in_signed_1,    input   signed  [7:0]   data_in_signed_2,
    output          [15:0]  data_out_000,    output          [15:0]  data_out_001,    output          [15:0]  data_out_010,    output          [15:0]  data_out_011,
    output  signed  [15:0]  data_out_100,    output  signed  [15:0]  data_out_101,    output  signed  [15:0]  data_out_110,    output  signed  [15:0]  data_out_111    );
//無符號(hào) = 無符號(hào) * 無符號(hào)assign data_out_000 = data_in_unsigned_1    * data_in_unsigned_2;//無符號(hào) = 無符號(hào) * 有符號(hào)assign data_out_001 = data_in_unsigned_1    * data_in_signed_2;//無符號(hào) = 有符號(hào) * 無符號(hào)assign data_out_010 = data_in_signed_1      * data_in_unsigned_2;//無符號(hào) = 有符號(hào) * 有符號(hào)assign data_out_011 = data_in_signed_1      * data_in_signed_2;
//有符號(hào) = 無符號(hào) * 無符號(hào)assign data_out_100 = data_in_unsigned_1    * data_in_unsigned_2;//有符號(hào) = 無符號(hào) * 有符號(hào)assign data_out_101 = data_in_unsigned_1    * data_in_signed_2;//有符號(hào) = 有符號(hào) * 無符號(hào)assign data_out_110 = data_in_signed_1      * data_in_unsigned_2;//有符號(hào) = 有符號(hào) * 有符號(hào)assign data_out_111 = data_in_signed_1      * data_in_signed_2;
endmodule

生成的 RTL 圖如下:

可以看到,輸出的積和符號(hào)無關(guān),有符號(hào)數(shù)和無符號(hào)數(shù)實(shí)際上是同一個(gè)數(shù),只看我們?cè)趺炊x它,比如乘積是 16 位的二進(jìn)制 16’b1100_0000_0000_0011,當(dāng)我們認(rèn)為它是無符號(hào)數(shù)是,最高位的 1 就不是符號(hào)位,而是 2^15(2的15次方),這樣這個(gè)數(shù)代表的十進(jìn)制是 2^15 + 2^14 + 2^1 + 2^0 = 49155;

f60c8b60-1b66-11ed-ba43-dac502259ad0.png

如果把 16 位的二進(jìn)制 16’b1100_0000_0000_0011 當(dāng)成是一個(gè)有符號(hào)數(shù)來看,那么最高位是符號(hào)位,且剩下的數(shù)據(jù)時(shí)原來的數(shù)據(jù)二進(jìn)制表示后取反再加1(補(bǔ)碼表示),要計(jì)算它對(duì)應(yīng)的十進(jìn)制數(shù)

(1)先去掉符號(hào)位,保留剩下的 15-bit的 100_0000_0000_0011;

(2)把 100_0000_0000_0011 取反,得到 011_1111_1111_1100;

(3)把 011_1111_1111_1100 的最低位 + 1,得到 011_1111_1111_1101;

(4)011_1111_1111_1101 按照無符號(hào)數(shù)換算成十進(jìn)制是 16381;

(5)把最高位符號(hào)位加上,0代表正數(shù),1代表負(fù)數(shù),所以最后換算是 -16831;

Windows計(jì)算器默認(rèn)最高位是符號(hào)位;

f6409c84-1b66-11ed-ba43-dac502259ad0.png

測(cè)試數(shù)據(jù)如下:

initial begin        data_in_unsigned_1 = 8'hff;       //255data_in_unsigned_2=8'hf0;      //240data_in_signed_1=8'hff;  //-1data_in_signed_2=8'hf0;  //-16    #200;        data_in_unsigned_1 = 8'hff;       //255        data_in_unsigned_2 = 8'h0f;       //15        data_in_signed_1 = 8'hff;         //-1data_in_signed_2=8'h0f;  //15    #200;        data_in_unsigned_1 = 8'd127;      //127data_in_unsigned_2=8'd15;//15        data_in_signed_1 = -8'sd127;      //-127,十進(jìn)制有符號(hào)數(shù)賦值,必須要用 sd 表示data_in_signed_2=-8'sd15;//-15    #200;             data_in_unsigned_1 = 8'd128;      //128        data_in_unsigned_2 = 8'd15;       //15               data_in_signed_1 = -8'sd128;      //-128data_in_signed_2=-8'sd15;//-15    #200;        data_in_unsigned_1 = 8'd127;       //127        data_in_unsigned_2 = 8'd15;        //15           data_in_signed_1=-8'sd127;  //-127data_in_signed_2=8'sd15;//15    #200;             data_in_unsigned_1 = 8'd128;       //128        data_in_unsigned_2 = 8'd15;        //15               data_in_signed_1=-8'sd128;  //-128data_in_signed_2=8'sd15;//15    #200;        data_in_unsigned_1 = 8'd127;       //127data_in_unsigned_2=8'd15;        //15        data_in_signed_1 = 8'sd127;        //127data_in_signed_2=-8'sd15;//-15    #200;                  data_in_unsigned_1 = 8'd127;       //127        data_in_unsigned_2 = 8'd15;        //15        data_in_signed_1 = 8'sd127;        //127data_in_signed_2=8'sd15;//15    #200;    $stop;end

2.仿真分析

計(jì)算的結(jié)果仿真如下:

f64c5bf0-1b66-11ed-ba43-dac502259ad0.png

對(duì)上圖分析:

(1)在 0~400 ns,仿真中使用十六進(jìn)制賦值相同的十六進(jìn)制數(shù)據(jù)給乘數(shù),讓乘數(shù)分別以無符號(hào)數(shù)和有符號(hào)數(shù)進(jìn)行讀取,可以看到對(duì) 8’hff(對(duì)應(yīng)二進(jìn)制 8’b1111_1111)以無符號(hào)數(shù)讀取時(shí)是按照 原碼讀取,對(duì)應(yīng)十進(jìn)制 255,以有符號(hào)數(shù)讀取時(shí)是按照補(bǔ)碼讀取,按照上文所說的去掉符號(hào)位后取反、加1再計(jì)算十進(jìn)制得 -1;

(2)直接賦值十進(jìn)制數(shù)據(jù),乘數(shù)在以無符號(hào)數(shù)讀取時(shí)時(shí)按照原碼讀取,127就對(duì)應(yīng) 8 位二進(jìn)制數(shù) 8’b0111_1111,十進(jìn)制 128 就對(duì)應(yīng) 8 位二進(jìn)制 8’b1000_0000;而以有符號(hào)數(shù)讀取的時(shí)候是會(huì)直接轉(zhuǎn)換為補(bǔ)碼形式,如 -127,先去掉符號(hào)位是 127,對(duì)應(yīng) 7 位二進(jìn)制數(shù) 7’b111_1111,取反為 7’b000_0000,加 1 為 7’b000_0001,將符號(hào)位補(bǔ)回到最高位為 8’b1000_0001;對(duì)于 -128 的表示比較特殊,8-bit的二進(jìn)制數(shù)最高位是符號(hào)位,表示正負(fù),剩下的 7-bit 能夠表示的數(shù)的范圍是 0 ~ 127,前面加上 ±就能表示 -127 ~ 127,其中有 2 個(gè)數(shù)很特殊就是 8’b0000_0000 和 8’b1000_0000,按照上面會(huì)出現(xiàn) +0 和 -0,為了區(qū)分出這兩個(gè)數(shù),前人定義 8’b0000_0000 表示 0,而 8’b1000_0000 表示 -128,這樣不僅能區(qū)分開兩個(gè)數(shù),還多表示了一個(gè)數(shù) -128(整個(gè)計(jì)算機(jī)體系通用,其他位數(shù)時(shí)類似表示一個(gè)負(fù)數(shù));

f664bd3a-1b66-11ed-ba43-dac502259ad0.png

(3)實(shí)際上,觀察下圖數(shù)據(jù)可以發(fā)現(xiàn),只有data_out_000 和 data_out_111 的數(shù)據(jù)時(shí)全部計(jì)算正確的,這也符合常理:

無符號(hào) * 無符號(hào) =無符號(hào);

有符號(hào) * 有符號(hào) =有符號(hào);

其它的計(jì)算為什么會(huì)出錯(cuò)呢?實(shí)際上這里遵循一個(gè)原則:

如果表達(dá)式中有一個(gè)無符號(hào)數(shù),則所有的操作數(shù)都會(huì)被強(qiáng)行轉(zhuǎn)換為無符號(hào)數(shù);

這樣也就解釋了 0~400 ns時(shí)的 data_out_001 和 data_out_010 的計(jì)算結(jié)果和 data_out_000 完全一致,它們都是把賦值的 8 位十六進(jìn)制數(shù)當(dāng)做無符號(hào)數(shù)計(jì)算的(這里不存在十進(jìn)制到二進(jìn)制原碼、補(bǔ)碼換算的問題,因?yàn)榻o的是十六進(jìn)制);

當(dāng)后面設(shè)計(jì)輸入輸出時(shí),如果是有符號(hào),那么將相關(guān)計(jì)算的輸入/輸出和中間量都顯式的用 signed定義;

f6738a90-1b66-11ed-ba43-dac502259ad0.png

3.有符號(hào)數(shù)乘法的另一種計(jì)算

前面說的計(jì)算時(shí)將涉及到的相關(guān)量全部定義為有符號(hào)數(shù)是一種計(jì)算方法,此外,通常情況下可能會(huì)定義的無符號(hào)數(shù),但是實(shí)際傳入的是有符號(hào)數(shù),比如下面的輸入和輸出都沒有指定成 signed有符號(hào)數(shù),計(jì)算時(shí)默認(rèn)是按照無符號(hào)數(shù)計(jì)算(實(shí)際上我感覺是把讀取到的 8 位二進(jìn)制數(shù)當(dāng)做原碼去算),此時(shí)若外部傳入的數(shù)據(jù)實(shí)際上是有符號(hào)數(shù)(比如 FIR 濾波器傳入了正負(fù)均有的待濾波信號(hào)),那么需要對(duì)符號(hào)位進(jìn)行擴(kuò)展來計(jì)算乘法和加法;

module signed_test_2(    input   [7:0]   data_in_1,    input   [7:0]   data_in_2,    output  [15:0]  data_out_1,    output  [15:0]  data_out_2);

對(duì)于乘法,需要擴(kuò)展符號(hào)位 到 和積的位數(shù)相等,比如乘數(shù)a為 N-bit,乘數(shù) b 為M-bit,兩個(gè)相乘得到 N+M 位數(shù)據(jù),此時(shí)需要對(duì) a擴(kuò)展 M-bit到 N+M 位,對(duì) b擴(kuò)展 N-bit到 N+M 位;

下面,使用位拼接符 {}來做演示,位拼接符可以按照二進(jìn)制的位來進(jìn)行高低位的拼接,假設(shè) data_in_1=8’b1000_0011,對(duì)于 {{8{data_in_1[7]}},data_in_1} 可以這樣理解:

(1)先看 8{data_in_1[7]},表示取出 8-bit數(shù)據(jù) data_in_1 的最高位 data_in_1[7],重復(fù) 8 次,相當(dāng)于 { data_in_1[7], data_in_1[7], data_in_1[7], data_in_1[7], data_in_1[7], data_in_1[7], data_in_1[7], data_in_1[7] },即高位擴(kuò)展 8-bit的 1

(2){{8{data_in_1[7]}},data_in_1} 相當(dāng)于在 data_in_1 的前面補(bǔ)上 8 個(gè) data_in_1[7],即 結(jié)果為 16-bit 的 16’b1111_1111_1000_0011;

//不做符號(hào)位擴(kuò)展,直接相乘assign data_out_1 = data_in_1 * data_in_2;//做符號(hào)位擴(kuò)展,再相乘assign data_out_2 = {{8{data_in_1[7]}},data_in_1} * {{8{data_in_2[7]}},data_in_2};

仿真測(cè)試數(shù)據(jù)如下,1處用十六進(jìn)制給出數(shù)據(jù),2處用有符號(hào)的十進(jìn)制賦值,3處是為了和 2處對(duì)比,看最后賦值是否一樣(看到有博客說 3 的賦值是錯(cuò)的,所以測(cè)試一下);

f69cc554-1b66-11ed-ba43-dac502259ad0.png

仿真結(jié)果如下,可以看到上圖 2 處和 3 處的賦值在仿真時(shí)是同樣的數(shù)據(jù),把所有數(shù)據(jù)都用有符號(hào)的十進(jìn)制數(shù)顯示(右鍵數(shù)據(jù) Radix-> Signed Decimal);

f6b15122-1b66-11ed-ba43-dac502259ad0.png

可以看到,data_out_1的結(jié)果是錯(cuò)的(沒有補(bǔ)符號(hào)位),data_out_2的結(jié)果是對(duì)的(補(bǔ)符號(hào)位);

f6c2c970-1b66-11ed-ba43-dac502259ad0.png

對(duì)有符號(hào)數(shù)的加法,同樣的,要么相關(guān)的運(yùn)算全部定義成有符號(hào)數(shù),要么進(jìn)行符號(hào)位的擴(kuò)展,對(duì)于加法操作,只需要每個(gè)被加數(shù)擴(kuò)展 1 位符號(hào)位即可;

除此之外,還可以調(diào)用乘法器的 IP 來代替 乘法符號(hào) *,或者加法器的 IP 來代替 加法符號(hào) +,在 IP 核中配置輸入輸出為有符號(hào)數(shù)即可。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 計(jì)算器
    +關(guān)注

    關(guān)注

    16

    文章

    438

    瀏覽量

    37479
  • fir濾波器
    +關(guān)注

    關(guān)注

    1

    文章

    95

    瀏覽量

    19097
  • Verilog語言
    +關(guān)注

    關(guān)注

    0

    文章

    113

    瀏覽量

    8310

原文標(biāo)題:有符號(hào)數(shù)的計(jì)算在

文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于DSPBuilder的FIR濾波器的系統(tǒng)該怎么設(shè)計(jì)?

    優(yōu)點(diǎn)使FIR濾波器成為明智的設(shè)計(jì)工程師的首選,在采用VHDL或VerilogHDL等硬件描述語言設(shè)計(jì)數(shù)字濾波器時(shí),由于程序的編寫往往不能達(dá)到
    發(fā)表于 08-30 07:18

    并行FIR濾波器Verilog設(shè)計(jì)

    本文將簡(jiǎn)單介紹FIR濾波器的原理,詳細(xì)介紹使用Verilog HDL設(shè)計(jì)并行FIR濾波器的流程和方法。接下來幾篇會(huì)介紹串行結(jié)構(gòu)
    發(fā)表于 09-25 17:44

    用窗函數(shù)設(shè)計(jì)FIR濾波器

    用窗函數(shù)設(shè)計(jì)FIR濾波器一、實(shí)驗(yàn)?zāi)康?、熟悉FIR濾波器設(shè)計(jì)的基本方法。2、掌握用窗函數(shù)設(shè)計(jì)FIR數(shù)字
    發(fā)表于 05-10 10:02 ?97次下載

    什么是fir數(shù)字濾波器 什么叫FIR濾波器

    什么是fir數(shù)字濾波器 Part 1: Basics1.1 什么是FIR濾波器?FIR 濾波器
    發(fā)表于 01-16 09:42 ?1.7w次閱讀

    fir_濾波器sourc

    fir濾波器的有關(guān)資料 fir_濾波器sourc.rar
    發(fā)表于 12-14 14:12 ?24次下載

    基于MATLAB的FIR濾波器設(shè)計(jì)與濾波

    基于MATLAB的FIR濾波器設(shè)計(jì)與濾波。
    發(fā)表于 12-14 22:08 ?64次下載

    詳解FIR濾波器和IIR濾波器的區(qū)別

    數(shù)字濾波器廣泛應(yīng)用于硬件電路設(shè)計(jì),一般分為FIR濾波器和IIR濾波器。那么FIR濾波器和IIR
    發(fā)表于 05-03 11:36 ?20次下載

    FIR濾波器的FPGA設(shè)計(jì)與實(shí)現(xiàn)

    ,結(jié)合MATLAB軟件提供的專用數(shù)字濾波器設(shè)計(jì)工具包FDATOOL,以及QuartusⅡ軟件提供的FIR核實(shí)現(xiàn)快速、便捷的設(shè)計(jì)FIR濾波器的幾個(gè)具體實(shí)驗(yàn),得出結(jié)論證實(shí)了熟練使用FDAT
    發(fā)表于 12-21 14:53 ?14次下載
    <b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>的FPGA設(shè)計(jì)與實(shí)現(xiàn)

    基于FPGA的橫向FIR濾波器設(shè)計(jì)詳解

    在理論的基礎(chǔ)上詳細(xì)闡述了如何基于Verilog HDL搭建的數(shù)字電路,來完成來完成FIR橫向濾波器的設(shè)計(jì)。
    的頭像 發(fā)表于 07-08 08:33 ?6016次閱讀

    詳細(xì)分析Verilog編寫程序測(cè)試無符號(hào)數(shù)和有符號(hào)數(shù)的乘法

    有符號(hào)數(shù)的計(jì)算在 Verilog 中是一個(gè)很重要的問題(也很容易會(huì)被忽視),在使用 Verilog 語言編寫 FIR
    的頭像 發(fā)表于 05-02 10:48 ?7614次閱讀
    詳細(xì)分析<b class='flag-5'>Verilog</b><b class='flag-5'>編寫</b>程序測(cè)試無符號(hào)數(shù)和有符號(hào)數(shù)的乘法

    Verilog并行FIR濾波器設(shè)計(jì)

    FIR(Finite Impulse Response)濾波器是一種有限長(zhǎng)單位沖激響應(yīng)濾波器,又稱為非遞歸型濾波器。FIR
    的頭像 發(fā)表于 03-27 11:33 ?1016次閱讀
    <b class='flag-5'>Verilog</b>并行<b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>設(shè)計(jì)

    Verilog串行FIR濾波器設(shè)計(jì)

    設(shè)計(jì)參數(shù)不變,與并行 FIR 濾波器參數(shù)一致。即,輸入頻率為 7.5 MHz 和 250 KHz 的正弦波混合信號(hào),經(jīng)過 FIR 濾波器后,高頻信號(hào) 7.5MHz 被濾除,只保留 25
    的頭像 發(fā)表于 03-27 11:36 ?930次閱讀
    <b class='flag-5'>Verilog</b>串行<b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>設(shè)計(jì)

    Verilog串行FIR濾波器設(shè)計(jì)

    設(shè)計(jì)參數(shù)不變,與并行 FIR 濾波器參數(shù)一致。即,輸入頻率為 7.5 MHz 和 250 KHz 的正弦波混合信號(hào),經(jīng)過 FIR 濾波器后,高頻信號(hào) 7.5MHz 被濾除,只保留 25
    的頭像 發(fā)表于 06-01 11:08 ?895次閱讀
    <b class='flag-5'>Verilog</b>串行<b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>設(shè)計(jì)

    Verilog并行FIR濾波器設(shè)計(jì)

    FIR(Finite Impulse Response)濾波器是一種有限長(zhǎng)單位沖激響應(yīng)濾波器,又稱為非遞歸型濾波器。
    的頭像 發(fā)表于 06-01 11:11 ?1280次閱讀
    <b class='flag-5'>Verilog</b>并行<b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>設(shè)計(jì)

    FPGA的數(shù)字信號(hào)處理:Verilog實(shí)現(xiàn)簡(jiǎn)單的FIR濾波器

    該項(xiàng)目介紹了如何使用 Verilog 實(shí)現(xiàn)具有預(yù)生成系數(shù)的簡(jiǎn)單 FIR 濾波器。
    的頭像 發(fā)表于 06-07 14:51 ?3756次閱讀
    FPGA的數(shù)字信號(hào)處理:<b class='flag-5'>Verilog</b>實(shí)現(xiàn)簡(jiǎn)單的<b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>