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

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

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

Verilog中的數(shù)據(jù)位操作技巧

CHANBAEK ? 來(lái)源:杰克拉力船長(zhǎng) ? 作者:杰克拉力船長(zhǎng) ? 2023-10-01 17:12 ? 次閱讀

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

FPGA相比MCU而言,在數(shù)據(jù)位操作上有很明顯的優(yōu)勢(shì)。FPGA支持任意位拼接以及數(shù)據(jù)截取操作。本篇主要是總結(jié)和分享一些對(duì)數(shù)據(jù)位操作的實(shí)用語(yǔ)法技巧。內(nèi)容不多,其中最最最重要的內(nèi)容是數(shù)據(jù)的動(dòng)態(tài)位截取操作。

下面正式進(jìn)入本章推送的內(nèi)容。

01 數(shù)據(jù)位操作技巧

數(shù)據(jù)移位(shift)

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

image.png

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


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

數(shù)據(jù)位拼接(concatenations)

顧名思義,“數(shù)據(jù)位拼接”是由多個(gè)表達(dá)式產(chǎn)生的位拼接在一起的輸出結(jié)果。其使用大括號(hào)“{}”來(lái)表示,內(nèi)部表達(dá)式之間使用逗號(hào)“,”隔開(kāi)。

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

數(shù)據(jù)位拼接操作示例如下:

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


//2. 復(fù)制拼接操作
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. 參數(shù)化代碼示例
parameter PARA = 32; //PARA = [1,32]
wire [31:0] e;
assign e = { {(32-PARA){1'b1}}, f[(PARA-1):0] };

數(shù)據(jù)位截取(bit select)

數(shù)據(jù)位截取(bit select)可以從線(xiàn)網(wǎng)( net )、寄存器( reg )、整數(shù)( integer )、時(shí)間( time )、參數(shù)( parameter )等類(lèi)型進(jìn)行任意位截取。IEEE中Verilog標(biāo)準(zhǔn)中對(duì)位截取的語(yǔ)法表達(dá)式如下:

vect[msb_expr : lsb_expr];
/*
其中msb_expr 是整形/常量表達(dá)式, lsb_expr 是常量表達(dá)式;
當(dāng)msb_expr為常量表達(dá)式時(shí),數(shù)據(jù)位截取則為靜態(tài)截取;
當(dāng)msb_expr為整形表達(dá)式時(shí),數(shù)據(jù)位截取則為動(dòng)態(tài)截?。?*/

靜態(tài)截取示例代碼如下:

//從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標(biāo)準(zhǔn)Verilog中,對(duì)reg、integer、time變量/parameter參數(shù)動(dòng)態(tài)截取語(yǔ)法如下所示:

//動(dòng)態(tài)截取操作語(yǔ)法
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為常量表達(dá)式, 在代碼運(yùn)行時(shí)不能改變;
lsb/msb_base_expr為整形表達(dá)式, 作為從在運(yùn)行時(shí)可以動(dòng)態(tài)改變;


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

在上面的代碼中,width_expr為常量表達(dá)式,代碼運(yùn)行時(shí)不能改變;lsb_base_expr/msb_base_expr 為整形表達(dá)式,在運(yùn)行時(shí)可以改變;代碼示例:

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的數(shù)據(jù)
big_vect[15-:8] //==big_vect[15:8], 從第15位向下截取8bit的數(shù)據(jù)


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


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

總結(jié)說(shuō)明:

在表達(dá)式vect[base_expr +:/-: width_expr]中,

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

base_expr為截取的 起始第bit位地址 ,可以 是整形變量值,動(dòng)態(tài)變更 ;

05 文章總結(jié)

對(duì)于一名優(yōu)秀的FPGA工程師而言,合理應(yīng)用數(shù)據(jù)位操作是一項(xiàng)非常重要的能力。對(duì)于一些特定的使用場(chǎng)合,合理使用數(shù)據(jù)位操作可以很大地節(jié)約邏輯資源。

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

    關(guān)注

    1625

    文章

    21628

    瀏覽量

    601254
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16900

    瀏覽量

    349948
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1343

    瀏覽量

    109927
  • 語(yǔ)法
    +關(guān)注

    關(guān)注

    0

    文章

    44

    瀏覽量

    9763
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    stm32的串口通信中的USART_WordLength,數(shù)據(jù)位的長(zhǎng)度包不包括開(kāi)始哪些?

    stm32的串口通信中的USART_WordLength,數(shù)據(jù)位的長(zhǎng)度包不包括開(kāi)始哪些?
    發(fā)表于 10-11 17:57

    請(qǐng)問(wèn)如何提取modbus RTU協(xié)議數(shù)據(jù)位?

    圖一是“接收內(nèi)容”-創(chuàng)建-字符串類(lèi)的屬性-顯示樣式(因?yàn)槭M(jìn)制顯示才能正常接收,否則亂碼),圖二是modbus rtu 協(xié)議的數(shù)據(jù)傳輸,圖三是傳感器傳輸?shù)摹敖邮諆?nèi)容”的一組數(shù)據(jù),請(qǐng)問(wèn)如何實(shí)現(xiàn)
    發(fā)表于 03-30 15:16

    串口數(shù)據(jù)位問(wèn)題

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

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

    任何人都可以幫助代碼或功能,將在4模式下接口4X20液晶和PIC18F46K22與端口1,2,3,4,而不是上或下Nybble,因?yàn)槲野l(fā)現(xiàn)的所有代碼。我已經(jīng)嘗試改變4X數(shù)據(jù)位和掩碼的移位,但是沒(méi)有成功。我希望有人有一個(gè)功能,你可以改變
    發(fā)表于 11-07 09:41

    如何收發(fā)數(shù)據(jù)位寬度為9數(shù)據(jù)?

    如何收發(fā)數(shù)據(jù)位寬度為9數(shù)據(jù)?
    發(fā)表于 01-27 06:33

    操作的相關(guān)資料推薦

    支持操作),詳情請(qǐng)參考相關(guān)內(nèi)核處理器的指南或技術(shù)參考手冊(cè)(TRM)。1、操作CPU不能直接對(duì)位帶區(qū)的單個(gè)
    發(fā)表于 02-07 09:24

    上位機(jī)如何設(shè)置串口9位數(shù)據(jù)位/TB8

    串口多機(jī)通訊,上位機(jī)如何設(shè)置串口9位數(shù)據(jù)位/TB8**常用的串口數(shù)據(jù)位設(shè)置只有5~8,但對(duì)于多機(jī)通訊要求9位數(shù)據(jù)位,即要求通過(guò)設(shè)置TB8區(qū)分地址與
    發(fā)表于 02-23 07:28

    在RTTlibmodbus支持的數(shù)據(jù)位是怎樣去配置的

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

    關(guān)于NICE接口傳輸?shù)?b class='flag-5'>數(shù)據(jù)位寬問(wèn)題

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

    stm32串口7位數(shù)據(jù)位

    STM32系列單片機(jī)控制寄存器只支持8、9位數(shù)據(jù)位
    的頭像 發(fā)表于 07-23 11:15 ?6626次閱讀

    stm32 7位數(shù)據(jù)位 usart_wordlength_

    stm32 7位數(shù)據(jù)位如何設(shè)置?一般情況下設(shè)置數(shù)據(jù)位為8、1個(gè)停止,再設(shè)置每個(gè)發(fā)送字節(jié)的最高位為“1”,去掉收到字節(jié)的最高位即可。這樣每個(gè)字節(jié)的最高位自動(dòng)變成1個(gè)停止
    的頭像 發(fā)表于 07-26 09:17 ?4887次閱讀

    問(wèn)題筆記:STM32串口數(shù)據(jù)位與校驗(yàn)

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

    初識(shí)“操作

    ”什么是“操作”?CPU不能直接對(duì)位帶區(qū)的單個(gè)數(shù)據(jù)位尋址,只能通過(guò)對(duì)位帶別名區(qū)的訪(fǎng)問(wèn)(或讀/寫(xiě))實(shí)現(xiàn)對(duì)位帶區(qū)單個(gè)
    發(fā)表于 01-12 17:18 ?0次下載
    初識(shí)“<b class='flag-5'>位</b>帶<b class='flag-5'>操作</b>”

    串行通信中的波特率、數(shù)據(jù)位和校驗(yàn)設(shè)置

    當(dāng)進(jìn)行串行通信時(shí),波特率、數(shù)據(jù)位和校驗(yàn)是必須要設(shè)置的參數(shù),以確保發(fā)送端和接收端之間的數(shù)據(jù)傳輸能夠正確進(jìn)行。
    的頭像 發(fā)表于 06-29 18:14 ?6622次閱讀

    RS-232串口通信起始,數(shù)據(jù)位,停止怎么區(qū)分?

    、數(shù)據(jù)位和停止。 1. 起始 起始是指在RS-232用來(lái)標(biāo)識(shí)開(kāi)始傳輸數(shù)據(jù)的信號(hào)
    的頭像 發(fā)表于 09-12 16:04 ?6686次閱讀