chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

FPGA之家 ? 來源:CSDN技術(shù)社區(qū) ? 作者: DengFengLai123 ? 2021-05-02 10:48 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

編寫程序如下,其中,乘法的兩個(gè)乘數(shù)分別是無符號、有符號的四種組合,輸出的積也是分為無符號和有符號,共計(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 );

//無符號 = 無符號 * 無符號assign data_out_000 = data_in_unsigned_1 * data_in_unsigned_2;//無符號 = 無符號 * 有符號assign data_out_001 = data_in_unsigned_1 * data_in_signed_2;//無符號 = 有符號 * 無符號assign data_out_010 = data_in_signed_1 * data_in_unsigned_2;//無符號 = 有符號 * 有符號assign data_out_011 = data_in_signed_1 * data_in_signed_2;

//有符號 = 無符號 * 無符號assign data_out_100 = data_in_unsigned_1 * data_in_unsigned_2;//有符號 = 無符號 * 有符號assign data_out_101 = data_in_unsigned_1 * data_in_signed_2;//有符號 = 有符號 * 無符號assign data_out_110 = data_in_signed_1 * data_in_unsigned_2;//有符號 = 有符號 * 有符號assign data_out_111 = data_in_signed_1 * data_in_signed_2;

endmodule

生成的 RTL 圖如下:

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

4e28e056-9d13-11eb-8b86-12bb97331649.png

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

(1) 先去掉符號位,保留剩下的 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 按照無符號數(shù)換算成十進(jìn)制是 16381;

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

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

4e3eb69c-9d13-11eb-8b86-12bb97331649.png

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

initial begin data_in_unsigned_1 = 8‘hff; //255 data_in_unsigned_2 = 8’hf0; //240 data_in_signed_1 = 8‘hff; //-1 data_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; //-1 data_in_signed_2 = 8’h0f; //15 #200; data_in_unsigned_1 = 8‘d127; //127 data_in_unsigned_2 = 8’d15; //15 data_in_signed_1 = -8‘sd127; //-127,十進(jìn)制有符號數(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; //-128 data_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; //-127 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; //-128 data_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; //127 data_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; //127 data_in_signed_2 = 8’sd15; //15 #200; $stop;end

2. 仿真分析

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

4e6ffb26-9d13-11eb-8b86-12bb97331649.png

對上圖分析:

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

(2) 直接賦值十進(jìn)制數(shù)據(jù),乘數(shù)在以無符號數(shù)讀取時(shí)時(shí)按照原碼讀取,127就對應(yīng) 8 位二進(jìn)制數(shù) 8’b0111_1111,十進(jìn)制 128 就對應(yīng) 8 位二進(jìn)制 8’b1000_0000;而以有符號數(shù)讀取的時(shí)候是會(huì)直接轉(zhuǎn)換為補(bǔ)碼形式,如 -127,先去掉符號位是 127,對應(yīng) 7 位二進(jìn)制數(shù) 7’b111_1111,取反為 7’b000_0000,加 1 為 7’b000_0001,將符號位補(bǔ)回到最高位為 8’b1000_0001;對于 -128 的表示比較特殊,8-bit的二進(jìn)制數(shù)最高位是符號位,表示正負(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ù));

4e7a71dc-9d13-11eb-8b86-12bb97331649.png

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

無符號 * 無符號 = 無符號;

有符號 * 有符號 = 有符號;

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

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

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

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

4ea872a8-9d13-11eb-8b86-12bb97331649.png

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

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

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

下面,使用 位拼接符 { } 來做演示,位拼接符可以按照二進(jìn)制的位來進(jìn)行高低位的拼接,假設(shè) data_in_1= 8’b1000_0011,對于 {{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;

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

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

4eb7e68e-9d13-11eb-8b86-12bb97331649.png

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

4ec3fa3c-9d13-11eb-8b86-12bb97331649.png

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

4ecead7e-9d13-11eb-8b86-12bb97331649.png

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

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

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

    關(guān)注

    162

    文章

    8207

    瀏覽量

    184033
  • Verilog
    +關(guān)注

    關(guān)注

    30

    文章

    1368

    瀏覽量

    113541
  • RTL
    RTL
    +關(guān)注

    關(guān)注

    1

    文章

    392

    瀏覽量

    62043
  • Vivado
    +關(guān)注

    關(guān)注

    19

    文章

    844

    瀏覽量

    70068

原文標(biāo)題:Verilog學(xué)習(xí)筆記——有符號數(shù)的乘法和加法

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    rt-thread studio怎么設(shè)置才能讓char變量是真正的符號類型?

    最近被一個(gè)bug折磨了3天,一路debug進(jìn)來,發(fā)現(xiàn)最終的原因是,定義了一個(gè)char變量,但實(shí)際上是符號的(代碼期望該變量是符號的)。 然后我檢查了以下編譯器如下的設(shè)置,發(fā)現(xiàn)很奇怪
    發(fā)表于 09-16 08:23

    詳細(xì)分析低煙鹵阻燃線載流量

    低煙鹵阻燃線的載流量并無統(tǒng)一固定值,其受線芯截面積、材質(zhì)、絕緣層特性、環(huán)境溫度及敷設(shè)條件等多重因素影響。以下是對其載流量的詳細(xì)分析: 一、低煙鹵阻燃線的特性 低煙鹵阻燃線是一種環(huán)
    的頭像 發(fā)表于 09-05 10:08 ?218次閱讀

    影響電解電容壽命的主要因素及其詳細(xì)分析

    電解電容的壽命受多種因素影響,這些因素相互作用,共同決定了電容在實(shí)際使用中的可靠性和穩(wěn)定性。以下是影響電解電容壽命的主要因素及其詳細(xì)分析: 一、核心影響因素:溫度 高溫加速老化 化學(xué)機(jī)制 :電解液中
    的頭像 發(fā)表于 08-08 16:15 ?973次閱讀

    Copilot操作指南(一):使用圖片生成原理圖符號、PCB封裝

    “ ?上周推出支持圖片生成模型的華秋發(fā)行版之后,得到了很多小伙伴的肯定。但看到更多的回復(fù)是:為什么我的 Copilot 無法生成符號?只有普通的文本回復(fù)?今天就為大家詳細(xì)講解下圖片生成符號、封裝
    的頭像 發(fā)表于 07-15 11:14 ?3495次閱讀
    Copilot操作指南(一):使用圖片生成原理圖<b class='flag-5'>符號</b>、PCB封裝

    機(jī)房托管費(fèi)詳細(xì)分析

    機(jī)房托管費(fèi)是一個(gè)復(fù)雜而多變的話題,它受到多種因素的影響,以下是對機(jī)房托管費(fèi)用的詳細(xì)分析,主機(jī)推薦小編為您整理發(fā)布機(jī)房托管費(fèi)詳細(xì)分析。
    的頭像 發(fā)表于 02-28 09:48 ?779次閱讀

    Verilog中signed和$signed()的用法

    1、在verilog中有時(shí)會(huì)用signed修飾符來修飾定義的數(shù)據(jù),運(yùn)算的時(shí)候也會(huì)用$signed()任務(wù)來強(qiáng)制轉(zhuǎn)換數(shù)據(jù),那么signed的修飾是為什么呢,是為了區(qū)分符號數(shù)
    的頭像 發(fā)表于 02-17 17:47 ?992次閱讀
    <b class='flag-5'>Verilog</b>中signed和$signed()的用法

    請問AFE5801 AD轉(zhuǎn)換后數(shù)字信號是用符號數(shù)還是符號數(shù)表示的?

    請問AFE5801 AD轉(zhuǎn)換后數(shù)字信號是用符號數(shù)還是符號數(shù)表示的?。?
    發(fā)表于 02-11 07:18

    adss光纜顏色詳細(xì)分析

    過程中的識別,還便于后續(xù)的維護(hù)和故障排除。以下是對ADSS光纜顏色的詳細(xì)分析: 一、光纖色譜排列 ADSS光纜內(nèi)部的光纖通常按照一定的色譜進(jìn)行排列,這些色譜包括藍(lán)、桔(橙)、綠、棕、灰、白等顏色,具體排列方式可能因光纜的芯數(shù)不同而有所差異。例如: 2~24芯規(guī)格:每管4芯,色譜排列順序
    的頭像 發(fā)表于 01-08 10:47 ?1162次閱讀

    開關(guān)二極管符號如何了解

    在電路圖中,開關(guān)二極管的符號通常與其他電子元件的符號一起使用,以表示電路的連接關(guān)系和功能。通過符號,我們可以清晰地看到開關(guān)二極管的正負(fù)極、連接方式以及與其他元件的相互作用。這有助于我們理解電路的工作原理、進(jìn)行電路
    的頭像 發(fā)表于 12-26 17:59 ?3122次閱讀
    開關(guān)二極管<b class='flag-5'>符號</b>如何了解

    ADS8688分別設(shè)置0 to 1.25 × VREF和±1.25 × VREF采樣范圍時(shí),得到的16位數(shù)據(jù)是按照符號數(shù)還是符號數(shù)進(jìn)行轉(zhuǎn)換?

    請問ADS8688 在分別設(shè)置 0 to 1.25 × VREF 和±1.25 × VREF采樣范圍時(shí),得到的16位數(shù)據(jù)是按照符號數(shù)還是符號數(shù)進(jìn)行轉(zhuǎn)換?兩者一樣嗎?
    發(fā)表于 12-20 08:03

    Verilog 測試平臺設(shè)計(jì)方法 Verilog FPGA開發(fā)指南

    Verilog測試平臺設(shè)計(jì)方法是Verilog FPGA開發(fā)中的重要環(huán)節(jié),它用于驗(yàn)證Verilog設(shè)計(jì)的正確性和性能。以下是一個(gè)詳細(xì)
    的頭像 發(fā)表于 12-17 09:50 ?1408次閱讀

     美國站群vps云服務(wù)器缺點(diǎn)詳細(xì)分析

    美國站群VPS云服務(wù)器在提供多項(xiàng)優(yōu)勢的同時(shí),也存在一些缺點(diǎn)。主機(jī)推薦小編為您整理發(fā)布美國站群vps云服務(wù)器缺點(diǎn)詳細(xì)分析。
    的頭像 發(fā)表于 12-12 10:43 ?635次閱讀

    原理圖符號和PCB封裝有什么不同?

    “ ?原理圖符號及PCB封裝是電子設(shè)計(jì)中最基本的要素。本文針對剛踏入電子設(shè)計(jì)的新人,介紹了原理圖符號與PCB封裝區(qū)別,以及在KiCad中兩者的對應(yīng)關(guān)系。 ” 什么是原理圖符號? 原理圖符號
    的頭像 發(fā)表于 12-04 18:13 ?3251次閱讀
    原理圖<b class='flag-5'>符號</b>和PCB封裝有什么不同?

    afe4900在測量的PPG信號比較弱的時(shí)候,有時(shí)取到的環(huán)境光信號是負(fù)的,怎么處理?

    我們發(fā)現(xiàn),在測量的PPG信號比較弱的時(shí)候,有時(shí)取到的環(huán)境光信號是負(fù)的(按照32bit符號數(shù)),PPG信號是反的,請問這種情況下,我們該怎么處理?如何獲取PPG的DC分量?
    發(fā)表于 12-04 08:19

    KiCad中不同GND符號的含義及應(yīng)用

    “ ?對于剛接觸電子設(shè)計(jì)的小伙伴,經(jīng)常會(huì)對原理圖中各種不同樣式的接地(GND)符號搞暈。GND、GNDA、GNDD、大地、機(jī)殼地等到底什么區(qū)別?該如何使用呢? ? ” 地的種類 我們先來
    的頭像 發(fā)表于 11-12 12:20 ?6483次閱讀
    KiCad中不同GND<b class='flag-5'>符號</b>的含義及應(yīng)用