色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Verilog中的數據位操作技巧

CHANBAEK ? 來源:杰克拉力船長 ? 作者:杰克拉力船長 ? 2023-10-01 17:12 ? 次閱讀

大家好,這里是程序員 杰克 。一名平平無奇的嵌入式軟件工程師

FPGA相比MCU而言,在數據位操作上有很明顯的優勢。FPGA支持任意位拼接以及數據截取操作。本篇主要是總結和分享一些對數據位操作的實用語法技巧。內容不多,其中最最最重要的內容是數據的動態位截取操作。

下面正式進入本章推送的內容。

01 數據位操作技巧

數據移位(shift)

Verilog中的移位操作有兩種:邏輯移位操作(logical)、算數移位操作(arithmetic)。邏輯移位使用“<<”、和“>>”,而算術移位使用“<<<”、和“>>>”,描述以及代碼示例如下所示:

image.png

//本示例使用邏輯、算術右移為例:
//邏輯右移( >>), 初始值為4'b1000, 移位結果為4'b0010
module shift();
reg [3:0] value, rusult;
initial begin
    value = 4'b1000;
    result = (value > > 2);
end
endmodule


//算術右移( >> >), 初始值為4'b1000, 移位結果為4'b1110
module shift();
reg signed [3:0] value, rusult;
initial begin
    value = 4'b1000;
    result = (value > >> 2);
end
endmodule

數據位拼接(concatenations)

顧名思義,“數據位拼接”是由多個表達式產生的位拼接在一起的輸出結果。其使用大括號“{}”來表示,內部表達式之間使用逗號“,”隔開。

對于位拼接操作,不允許使用不確定大小的常量;位拼接中唯一可以使用的操作是復制(replication)。

數據位拼接操作示例如下:

//1. 簡單位拼接操作
reg [1:0] a;
reg [3:0] b;
reg [9:0] result = {2'b10, a, b[2:0], 3'd7};


//2. 復制拼接操作
reg [1:0] c;
reg [2:0] d;
reg [9:0] result;
result = {2{c, d}};//=={ {c[1:0], d[2:0]}, {c[1:0], d[2:0]} }


//3. 參數化代碼示例
parameter PARA = 32; //PARA = [1,32]
wire [31:0] e;
assign e = { {(32-PARA){1'b1}}, f[(PARA-1):0] };

數據位截取(bit select)

數據位截取(bit select)可以從線網( net )、寄存器( reg )、整數( integer )、時間( time )、參數( parameter )等類型進行任意位截取。IEEE中Verilog標準中對位截取的語法表達式如下:

vect[msb_expr : lsb_expr];
/*
其中msb_expr 是整形/常量表達式, lsb_expr 是常量表達式;
當msb_expr為常量表達式時,數據位截取則為靜態截取;
當msb_expr為整形表達式時,數據位截取則為動態截取;
*/

靜態截取示例代碼如下:

//從vect[31:0]截取低16位賦值給value[15:0]
module bit_select();
reg [31:0] vect;
reg [15:0] value;
initial begin
  vect = 32'hAAAA_CCCC;
  value = vect[23:8]; //value = 16'hAACC;
end
endmodule

IEEE標準Verilog中,對reg、integer、time變量/parameter參數動態截取語法如下所示:

//動態截取操作語法
reg [15:0] big_vect;
reg [0:15] little_vect;


big_vect    [lsb_base_expr +: width_expr]
little_vect [msb_base_expr +: width_expr]


bit_vect    [msb_base_expr -: width_expr]
little_vect [lsb_base_expr -: width_expr]
/*
width_expr為常量表達式, 在代碼運行時不能改變;
lsb/msb_base_expr為整形表達式, 作為從在運行時可以動態改變;


width_expr作為截取的位寬值, 而msb/lsb_base_expr為截取的起始地址;
“+”為地址向上遞增操作, “-”為地址向下遞增操作;
上面代碼功能是: 
從msb/lsb_base_expr地址開始, 向上(+)/向下"-"截取width_expr位寬的數據;
*/

在上面的代碼中,width_expr為常量表達式,代碼運行時不能改變;lsb_base_expr/msb_base_expr 為整形表達式,在運行時可以改變;代碼示例:

reg [31:0] big_vect;
reg [0:31] little_vect;
reg [63:0] dword;
integer sel;


big_vect[0 +:8] //==big_vect[7 :0], 從第0位向上截取8bit的數據
big_vect[15-:8] //==big_vect[15:8], 從第15位向下截取8bit的數據


little_vect[0 +:8] //==little_vect[0: 7]
little_vect[15-:8] //==little_vect[8:15]


dword[8*sel +: 8] //從第(8*sel)位截取8位寬

總結說明:

在表達式vect[base_expr +:/-: width_expr]中,

width_expr為截取的固定位寬,是常量值;

base_expr為截取的 起始第bit位地址 ,可以 是整形變量值,動態變更 ;

05 文章總結

對于一名優秀的FPGA工程師而言,合理應用數據位操作是一項非常重要的能力。對于一些特定的使用場合,合理使用數據位操作可以很大地節約邏輯資源。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1629

    文章

    21729

    瀏覽量

    603057
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17135

    瀏覽量

    351033
  • Verilog
    +關注

    關注

    28

    文章

    1351

    瀏覽量

    110078
  • 語法
    +關注

    關注

    0

    文章

    44

    瀏覽量

    9808
收藏 人收藏

    評論

    相關推薦

    stm32的串口通信中的USART_WordLength,數據位的長度包不包括開始哪些?

    stm32的串口通信中的USART_WordLength,數據位的長度包不包括開始哪些?
    發表于 10-11 17:57

    請問如何提取modbus RTU協議數據位

    圖一是“接收內容”-創建-字符串類的屬性-顯示樣式(因為十六進制顯示才能正常接收,否則亂碼),圖二是modbus rtu 協議的數據傳輸,圖三是傳感器傳輸的“接收內容”的一組數據,請問如何實現
    發表于 03-30 15:16

    串口數據位問題

    原子哥在串口初始化 void uart_init(u32 pclk2,u32 bound){。。。。USART1->CR1|=0X200C;//1停止,無校驗.。。。。}沒有對bit12進行或
    發表于 06-13 04:35

    如何使用不同數據位的LCD改變4X數據位和掩碼的移位?

    任何人都可以幫助代碼或功能,將在4模式下接口4X20液晶和PIC18F46K22與端口1,2,3,4,而不是上或下Nybble,因為我發現的所有代碼。我已經嘗試改變4X數據位和掩碼的移位,但是沒有成功。我希望有人有一個功能,你可以改變
    發表于 11-07 09:41

    如何收發數據位寬度為9數據

    如何收發數據位寬度為9數據
    發表于 01-27 06:33

    操作的相關資料推薦

    支持操作),詳情請參考相關內核處理器的指南或技術參考手冊(TRM)。1、操作CPU不能直接對位帶區的單個
    發表于 02-07 09:24

    上位機如何設置串口9位數據位/TB8

    串口多機通訊,上位機如何設置串口9位數據位/TB8**常用的串口數據位設置只有5~8,但對于多機通訊要求9位數據位,即要求通過設置TB8區分地址與
    發表于 02-23 07:28

    在RTTlibmodbus支持的數據位是怎樣去配置的

    一、結論大家都很忙,所以先說結論。libmodbus 中支持的數據位為 5,6,7,8(圖1)。 但是,如果使用STM32 并且配置了奇偶校驗,那么正確的數據長度配置應該是9。有人說這是ST的bug
    發表于 03-16 09:51

    關于NICE接口傳輸的數據位寬問題

    上圖是NICE 接口的內存通道,圖中內存通道的讀寫數據位寬都是32bit,根據賽題要求,需要在協處理器設計加速核心,掛靠NICE接口 我的預期:我所設計的加速核心需要更大的數據帶寬(比如
    發表于 08-12 07:40

    stm32串口7位數據位

    STM32系列單片機控制寄存器只支持8、9位數據位
    的頭像 發表于 07-23 11:15 ?6721次閱讀

    stm32 7位數據位 usart_wordlength_

    stm32 7位數據位如何設置?一般情況下設置數據位為8、1個停止,再設置每個發送字節的最高位為“1”,去掉收到字節的最高位即可。這樣每個字節的最高位自動變成1個停止
    的頭像 發表于 07-26 09:17 ?4993次閱讀

    問題筆記:STM32串口數據位與校驗

    問題:STM32移植freemodbus 后測試時,只能使用無校驗 ,設置奇偶校驗時無法與上位機通訊解決方法如果串口助手使用串口配置為:數據位8 停止1 有奇偶校驗STM32需設置為:數據位9
    發表于 12-24 18:44 ?19次下載
    問題筆記:STM32串口<b class='flag-5'>數據位</b>與校驗<b class='flag-5'>位</b>

    初識“操作

    ”什么是“操作”?CPU不能直接對位帶區的單個數據位尋址,只能通過對位帶別名區的訪問(或讀/寫)實現對位帶區單個
    發表于 01-12 17:18 ?0次下載
    初識“<b class='flag-5'>位</b>帶<b class='flag-5'>操作</b>”

    串行通信中的波特率、數據位和校驗設置

    當進行串行通信時,波特率、數據位和校驗是必須要設置的參數,以確保發送端和接收端之間的數據傳輸能夠正確進行。
    的頭像 發表于 06-29 18:14 ?6979次閱讀

    RS-232串口通信起始數據位,停止怎么區分?

    數據位和停止。 1. 起始 起始是指在RS-232用來標識開始傳輸數據的信號
    的頭像 發表于 09-12 16:04 ?7126次閱讀
    主站蜘蛛池模板: 一本之道加勒比在线观看| 欧美 亚洲 日韩 在线综合| 国产精品点击进入在线影院高清| 99久久99久久精品免费看子| 又粗又大又爽又黄的免费视频| 亚洲欧美精品无码大片在线观看| 国产成人久久精品激情| 被室友C哭调教双性| SM脚奴调教丨踩踏贱奴| 99热在线视频| av天堂网2017avtt| np高h肉辣一女多男| www.绿巨人| 成年色黄APP下载| 纲手裸乳被爆白浆| 国产AV亚洲精品久久久久| 伊人影院综合| 永久免费在线观看视频| 永久免费无码AV国产网站| 在线亚洲专区中文字幕| 2021久久精品免费观看| 91精选国产| 边吃胸边膜下床震免费版视频| 成年私人影院网站在线看| 国产AV精品白浆一区二| 国产精品亚洲精品久久国语| 国产欧美二区综合| 狠狠狠狠狠狠干| 久久国产免费| 男女一边摸一边做羞羞的事情免费| 欧美久久综合性欧美| 狼好色有你好看| 花蝴蝶高清观看免费| 久久久久九九| 欧美激情精品久久久久| 色男人综合| 亚洲乱亚洲乱妇在线观看| 中文有码中文字幕免费视频| 亚洲AV噜噜狠狠网址蜜桃尤物| 亚洲精品乱码久久久久久v| 诱咪视频免费|