當前位置:首頁 » 服務存儲 » Verilog存儲不定長數據
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

Verilog存儲不定長數據

發布時間: 2022-07-01 09:16:25

⑴ verilog表達式的數據類型

1. 常量

verilog有四種基本值:

·0表示邏輯0或「假」;

·1表示邏輯1或「真」;

·x表示未知;

·z表示高阻。

x和z在這里是不分大小寫的。也就是說,0x1z和0X1Z是相同的。

1.1 整型常量

整形常量即整數,Verilog的整數有兩種書寫格式:

·十進制數格式和基數格式。

(1)十進制數格式是一個可以帶正負號的數字序列,代表一個有符號數。

(2)基數格式的數通常都是無符號數。形式如下:

[size]'base value

size定義常量的位數(長度),這是可選項;base是基數,規定數據的進制,可以是o(八進制)、B、H和D。value是一個數字序列,其形式應與base定義的形式相符。

7'Hx //7位x(擴展的x),即xxxxxxx

4'HZ //4位Z,即ZZZZ

如果size定義的長度大於數字的實際長度,通常在數據序列的高位補0.但是如果這個數字序列最左邊一位是x或z,就用x或z在左邊補位。如果定義的長度小於數字序列的實際長度,這個數字序列最左邊超出的位將被截斷。

1.2 實數型常量

在verilog中,實數就是浮點數,實數的定義方式有兩種:

(1)十進制格式,由數字和小數點組成。

(2)指數格式,由數字和字元e(E)組成,e(E)的前面必須要有數字而且後面必須為整數:

23_5.1e2 //其值為23510.0,忽略下劃線

3.6E2 //其值為360.0

這里的e可以理解為10。

1.3 字元串型常量

字元串常量是由一對雙引號括起來的字元序列。

2 變數

2.1 線網型變數

線網表示元件之間的物理連線,它 不能存儲數據。線網是被驅動的,可以用連續賦值或把元件的輸出連接到線網等方式給線網提供驅動,給線網提供驅動的賦值元件就是「驅動源」,線網的值由驅動源決定。如果沒有驅動源連接到線網,線網的預設值為Z。

verilog共有11種線網類型:wire tri wor trior wand triand trireg tril tri0 supply0 supply1。

線網的聲明語法形式:net_kind[msb:lsb]net1, net2, .........,netN;

net_kind是線網類型;[msb:lsb]定義線網寬度????????的最高位和最低位,這一項是可選的,默認為一位;netN是線網變數的名稱。線網可以有多個驅動源,每個驅動源都會給線網賦值,出現這種情況時,線網的取值由線網類型決定。

關於位寬的一點補充:

最高有效位(MSB)
指二進制中最高值的比特。在16比特的數字音頻中,其第1個比特便對16bit的字的數值有最大的影響。例如,在十進制的15,389這一數字中,相當於萬數那1行(1)的數字便對數值的影響最大。比較與之相反的「最低有效位」(LSB)。匯編中,比如8位2進制數10000001,其中第一個1是MSB,第二個1是LSB。在計算機計算的時候用於判斷的比如如果是整數那麼小數點(實際上是沒有小數點的,但就把那一位和下一位之間看作有)在LSB後面,如果是小數小數點在MSB後面,其中MSB在有符號數中又是符號位。

在這11種線網中,經常用到的是前六種,下面給出其詳細的用法舉例。

(1)wire和tri線網

有些問題,先跳過!

(2)wor和trior線網

·wor線或 ·trior三態線或

(3)wand和triand線網

·wand線與 ·triand線與

(4)trireg線網(三態寄存器)

這種線網可以存儲數值,可用於電容節點的建模。當沒有驅動源時,三態寄存器線網的預設初始值為x。當它的所有驅動源都處於高組態時,三態寄存器保存的值是作用在該線網上的最後一個值。

(5)tri0和tri1線網

·tri0 三態0 ·tri1 三態1

這兩個的特徵是,若無驅動源(z可視為無驅動源),它的值為0(tri0)或1(tri1)。

(6)supply0 supply1線網

·supply0用於對「地」建模,即低電平。

·supply1用於對電源建模,即高電平1。

2.2 寄存器型變數

寄存器表示一個抽象的數據存儲單元,可以通過賦值語句改變寄存器內存儲的值。寄存器只能在always語句和initial語句中賦值,always語句和initial語句是verilog提供的功能強大的結構語句。在未被賦值時,寄存器的預設值為x。

verilog共有五種寄存器類型:reg integer time real realtime。

2.2.1 reg寄存器

(1)reg寄存器的類型

reg寄存器是最常用的寄存器類型,這種寄存器中只能存放無符號數。如果給reg中存入一個負數,通常會被視為正數。

(2)用reg聲明存儲器

在verilog中不能直接聲明存儲器,存儲器是通過寄存器數組聲明的,即用reg聲明。可以說,存儲器是由若干個寄存器組成的,通過定義單個寄存器的位寬和寄存器的個數可以決定存儲器的大小。

存儲器聲明如下:

reg [msb:lsb] memory1 [upper1:lower1], memory2 [upper2:lower2], ...............

其中msb、lsb定義了存儲器單個寄存器的位寬,memory1和memory2是存儲器名;upper和lower分別定義了這兩個存儲器的大小。

2.2.2 integer寄存器類型

integer是整數寄存器,也是verilog中最常用的變數類型,這種寄存器中存儲有符號整數值。integer即可以定義單個寄存器,也可以用來定義一個寄存器組。整數寄存器中最少可以容納32位的數,但是不能作為位向量訪問

2.2.3 time寄存器類型

time類型寄存器用於存儲和處理時間,通常用在系統函數$time中。其聲明形式如下:

time time_id1, time_id2, ..........,time_idN[msb:lsb];

msb lsb是規定范圍界限的常量,這個范圍將決定寄存器內能存儲時間值的個數,如果未定義界限,默認值為1,那麼每個寄存器只能存儲一個至少64位的時間值。time類型的寄存器只存儲無符號數。

2.2.4 real和realtime寄存器類型

real(實數型寄存器)和realtime(實數型時間寄存器)一般用於在測試模塊中存儲模擬時間,二者聲明形式完全相同。real變數的預設值為0,當將值x和z賦給real型寄存器時,這些值被當作0。

3. 表達式

3.1 操作數

操作數即運算對象,位於操作符左右兩側。操作數有以下8種類型:常數、參數、線網、寄存器、位選擇、部分選擇、存儲器單元、函數調用。

(1)常數:表達式中經常出現常數,一般是做運算或賦值。表達式中的整數值可以是有符號數或無符號數。如果表達式中的整數形式是十進制整數,就會被當作有符號數,如果整數形式是基數型整數,那麼該整數會被當作無符號數對待。

(2)參數:參數類似於常量,表達式中出現的參數都作為常數對待。參數是用某標識符代表某個數字的,所以定義它時要給它賦值。

(3)線網

(4)寄存器:寄存器是在表達式中出現次數最多的操作數,許多程序語句都是通過對寄存器中存儲的值進行轉換和傳輸實現設計目的的。注意:整型寄存器中的值被視為有符號的二進制補碼數;實數和實數時間類型寄存器中的值被視為有符號浮點數;而reg寄存器或時間寄存器中的值被視為無符號數。

(5)位選擇

(6)部分選擇

(7)存儲器單元:存儲器建模是使用reg聲明寄存器組,不能在一條語句內就完成對存儲器內所有寄存器單元的賦值,必須對其中的存儲單元進行賦值。形式如下:

memory[word_address]

其中,memory是存儲器名,word_address是要選擇單元的編號。不允許對存儲器單元做位選擇或部分選擇。

(8)函數調用:verilog中的函數和C語言中的函數沒什麼大的區別,都用來實現某個計算過程或完成某個事件處理。函數可以被隨意調用,函數調用也可以作為表達式中的操作數。調用的函數可以是系統函數(以字元$開始)或用戶定義的函數。

3.2 操作符

verilog的操作符有如下九種類型:

·算術操作符

·關系操作符

·相等操作符

·邏輯操作符

·按位操作符

·歸約操作符

·移位操作符

·條件操作符

·連接和復制操作符

(1)算術操作符

+ - * 、 %

·整數除法截斷所有小數部分。

·模操作符求出與第一個操作數符號相同的余數,如-7/4結果為-3。

·如果算術操作符的操作數中出現x或z,那麼整個算術操作的運算結果為x。

·算術操作結果的長度

進行算術操作時,表達式中操作數的長度可能不一致,這時運算結果的長度由最長的操作數決定。在賦值語句中,算術操作符結果的長度由操作符左端的賦值目標長度決定。

reg [0:3] Arc, Bar, Crt;

reg [0:5] Frx;

Arc = Bar + Crt;

Frx = Bar + Crt;

在第一個賦值中,加法操作的溢出部分被丟棄,而在第二個賦值中,任何溢出的為存儲在位Frx[1]中。在較大的表達式中,中間結果的長度應取最大操作數的長度(在賦值時此規則也包括左端賦值目標)。

·無符號數和有符號數

執行算術操作和賦值時,要注意哪些操作數時無符號數、哪些操作數是有符號數。無符號數存儲在線網、一般寄存器和基數格式表示形式的整數中。有符號數存儲在整數寄存器和十進制形式的整數中。

·關系操作符

關系操作符是對兩個操作數進行比較,如果比較結果為真則結果為1,如果比較結果為假則結果為0,關系操作符多用與條件判斷。 > < >= <=

如果操作數中有x或z出現,那麼結果為x。

·相等操作符

四種:== != === !== 其中==和!=是比較邏輯值,由於操作數中某些位可能是x,所以比較結果也有可能是x。===和!==是按位比較,所以不會出現結果為x的情況。

·邏輯操作符

&& || !

如果操作數是向量,那麼非0向量被當作邏輯1。

·位操作符

位操作符是對操作數按位進行與、或、非等邏輯操作。

~:一元非 &:二元與 | : 二元或 ^~,~^二元異或或非

·規約操作符

規約操作符的操作數只有一個,並只產生一位結果。共有如下6種:

(1)& 規約與 將操作數的各位進行與操作的結果。

(2)~& 規約與非 與規約與相反。

(3)| 規約或 將操作數的各位進行或操作的結果。

(4)~| 規約或非

(5)^ 規約異或:某個位有x或z,結果為x,操作數有偶數個1,那麼結果為0;否則為1。

·移位操作符

<< >>

·條件操作符

條件操作符是根據條件表達式的值來選擇執行表達式,形式如下:

cond_expr?expr1:expr2

其中,con_expr是條件表達式,他的結果是真或假,expr1和expr2是待選的執行表達式。con_expr為真,選擇執行1,否則選擇執行2。如果con_expr為x或z,兩個都要計算,然後對計算結果按位運算,某一位都為1,則結果為1,都為0,結果為0,否則為x。

·連接操作符

連接操作符是把位於大括弧{}中的兩個或以上用「,」分隔的小表達式按位連接在一起,形成一個大表達式。

·賦值操作符

⑵ verilog設置的存儲器 中讀出其中的某個數據的特定位怎麼操作呢

你的寫法是對的

若用verilog-1995版本標准來編譯會出錯 因為此版本不支持array變數的element的部分bit選擇
verilog-2001以後都支持

⑶ verilog 普通存儲器怎麼由地址線決定寫入或讀取任意指定的地址

首先你這個地址肯定對應的一個寄存器或者存儲器單元了,讀取的話直接將其賦值給一個變數就好了比如一個256x8bit的RAM,你取地址為128的內容的話,就直接這樣寫:variable=ram[128];如果是非阻塞賦值的話,variable

⑷ verilog語言入門教程

verilog語言入門教程如下:

1、Verilog語言用於FPGA領域,在quartus ii中進行編輯,點擊打開quartus ii,如下圖所示。


⑸ 請教verilog存儲器的讀寫

首先輸入不用設高阻 然後一般都是DSP主動操作,FPGA沒法主動往DSP里送數據,就算你送到匯流排上了,DSP也不知道要去讀,所以還是要例化一個RAM,單雙口皆可,把數據存裡面等 DSP 主動來讀的

⑹ 請教Verilog 中memory 型數據的問題

恩,樓上的都不對。
首先你要明確mem1不是一個二維數組,它是一維的。reg表示mem1中的元素都是寄存器類型,reg後面的[7:0]表示的是mem1每個數組的元素的位寬是8bit。

如果想表示mem1數組的第A個元素的第B到第C位的內容,可表示如下
mem1[A][B:C]

憑記憶寫的,大致如上,你可以查閱verilog相關書籍的語法部分驗證一下~

⑺ Verilog如何存儲連續兩個輸入數據

比如你輸入的是N位,那麼定義2N寬的reg
reg [2N-1:0]shift_reg;
然後按照先後兩個時鍾次序,兩次安高和低賦值:
shift_reg[N-1:0] <= in;

shift_reg[2N-1:N] <= in;

⑻ 請問有人知道用verilog實現鐵電存儲器存儲功能的代碼嗎

譯文: 內存架構(存儲器結構) 用戶可使用32,768個存儲單元,每個單元通過並行介面有8個數據位。完整的15位地址可以分別指出32,768 位元組的每一個位元組。在內部,存儲器陣列有32個存儲塊組成,每個存儲塊有8000位元組...

⑼ Verilog如何將數據存為文件

如下:
從 a . t x t 文 件 中 按 十 六 進 制 讀 取 到 d a t a b u f f i l e = readmemh("a.txt",data_buf);//從a.txt文件中按十六進 制 讀取到data_buf file= readmemh("a.txt",datab_uf);//從a.txt文件中按十六進制讀取到datab_uffile=fopen(「a.data_o.txt」,「w」);//以讀的方式打開文件a_data_o.txt,待會將會把數據輸出到改文件中。