Verilog HDL语言总结(全)
目錄
1 、Verilog HDL基本結構
2 、數據類型
(1)寄存器型
(2)線型
(3)符號常量
(4)寄存器數組
3 、 運算符
(1)算術運算符
(2)邏輯運算符
?(3)按位運算符
(4)關系運算符
(5)等式運算符
(6)移位運算符
(7)條件運算符
(8)拼位運算符
?4 、語句
(1)賦值語句
?(2)結構說明語句(always+initial)
(3)if語句?
?(4)case語句
?(5)循環語句(repeat+forever+while+for)
1 、Verilog HDL基本結構
1. Verilog HDL程序是由模塊構成的。每個模塊嵌套在module和endmodule聲明語句中。
2 每個Verilog HDL源文件中只有一個頂層模塊,其他為子模塊。可以每個模塊寫一個文件。
3.每個模塊要進行端口定義,并說明輸入輸出端口,然后對模塊的功能進行行為邏輯描述。
4.模塊中的時序邏輯部分在always塊的內部,在always塊中只能對寄存器變量賦值。
5.模塊中對端口或其他wire型變量的賦值,必須在always塊的外部使用assign語句,通常是將寄存器的值送出
6.程序書寫格式自由,一行可以寫幾個語句,一個語句也可以分多行寫。
7. 除了endmodule語句、begin_end語句和fork_join語句外,每個語句和數據定義的最后都要加分號
8.可用/*.....*/和//...對程序的任何部分作注釋。加上必要的注釋,可以增強程序的可讀性
2 、數據類型
首先對數的表示方式進行講解,Verilog只能表示二進制的邏輯值,可以為0,1,高阻,未知
如下圖所示, 數在Verilog里面有3種表示
Verilog的數據類型分為 寄存器型(reg) 線型(wire) 符號常量(parameter) 寄存器數組
(1)寄存器型
之所以reg叫做寄存器型,是因為數字電路中的觸發器只在時鐘有效邊沿到來的時候,保存的值才能夠發生改變。
reg型信號的定義格式如下:
定義一個n位的寄存器變量 : reg [n-1:0]變量名;
定義m個n位的寄存器變量 : reg [n-1:0]變量名1,變量名2,....變量名m;
下面給出2個例子:
reg [7:0] a, b, c;? ? //a, b, c都是位寬為8位的寄存器
reg d;? ?//1位的寄存器d
?
(2)線型
wire型信號的定義格式如下:
定義一個n位的wire變量 : wire [n-1:0]變量名;
定義m個n位的wire變量 : wire [n-1:0]變量名1,變量名2,.變量名m;
下面給出2個例子:
wire [7:0] a, b, c;? ?// a, b, c都是位寬為8位的wire
wire d;? ? //d是1位的wire
(3)符號常量
如果用關鍵詞parameter來定義一個標識符,代表一個常量,這個常量就被稱為符號常量。
例如: parameter width=3;//符號常量width的值是3,如果未進行重定義,當在程序中出現width時就用3代替。
同樣的,可以一次性定義多個符號常量,parameter idle=1,one=2,two=3,stop=4;//定義了4個符號常量。如果未進行重定義,當代碼中出現idle就用1代替,出現one就用2代替,出現tow就用3代替,出現stop就用4代替。
但是符號常量可以被重定義,使用#即可
如下圖,一開始time_delay=5? time_count=10,重定義之后time_delay=4? time_count=8
?
(4)寄存器數組
存儲器實際上是一個寄存器數組。
存儲器使用如下方式定義reg [ msb: lsb] memory1 [ upper: lower]?
(upper:lower)代表寄存器個數,(msb是最高有效位,lsb是最低有效位)代表每個寄存器的位數?
例如:
reg[3:0] mymem1[63:0];? ? ? ?//mymem1為64個4位寄存器的數組。
reg dog [1:5];? ? ? ? ?//dog為5個1位寄存器的數組。
dog[4]= 1;? ? ? ? ? ? //合法賦值語句,對其中一個1位寄存器賦值。
dog[1:51]= 0;? ? ? //合法賦值語句,對存儲器大范圍賦值。
3 、 運算符
(1)算術運算符
| 算術運算符 | 說明 |
| + | 加 |
| - | 減 |
| * | 乘 |
| / | 除 |
| % | 取模(余數) |
在進行整數的除法運算時,結果要略去小數部分,只取整數部分;
進行取模運算時( %)?結果的符號位采用模運算符中第一個操作數的符號。例如,-10%3結果-1,11%-3 結果為2。
在進行算術運算時,如果某一個操作數有不確定的值x,則整個結果也為不確定值x。
(2)邏輯運算符
| 邏輯運算符 | 說明 |
| && | 邏輯與 |
| || | 邏輯或 |
| ! | 邏輯非 |
邏輯運算最常用于條件判斷語句。邏輯運算只區分真假,而不管是什么數值。邏輯運算的輸入4'ha1和4'h01是沒有區別的,都是邏輯真,而0為邏輯假。一般來說,邏輯運算的結果要么為真(1)要么為假(0)
特例是如果有一個輸入為未知X,那么結果也是X。
例如,4'ha1&&4h01是1,4'ha1&&4h00是0。
■對于邏輯與或:只有兩個輸入都是0的時候,邏輯或的結果才是0。
■對于邏輯非:當輸入為非0值,輸出就是0。
?(3)按位運算符
| 按位運算符 | 說明 |
| & | 按位與 |
| | | 按位或 |
| ~ | 按位取反 |
| ^ | 按位異或 |
| ~^? ?^~ | 按位同或 |
按位運算符是對照數據的每一位進行運算,?例如0101&1100=0100,0101|1100=1101
ps:異或是指如果a、b兩個值不相同,則異或結果為1。如果a、b兩個值相同,異或結果為0。
同或是指如果a、b兩個值不相同,則同或結果為0。如果a、b兩個值相同,同或結果為1。
(4)關系運算符
| 關系運算符 | 說明 |
| < | 小于 |
| <= | 小于等于 |
| > | 大于 |
| >= | 大于等于 |
關系運算符和邏輯運算符一般用于條件判斷語句。
關系運算結果為1位的邏輯值1(真)或0(假),但也可能是x(未知)。關系運算符根據關系運算的結果是真還是假,用于條件判斷。
關系運算時,若關系為真,則返回值為1;若聲明的關系為假,則返回值為0;若某操作數為不定值x,則返回值也一定為x。
(5)等式運算符
| 等式運算符 | 說明 |
| == | 等于 |
| != | 不等于 |
| === | 全等于 |
| !== | 全不等于 |
"=="和"!="稱作邏輯等式運算符,其結果由兩個操作數的值決定。由于操作數可能是x或z,其結果可能為x。
"==="和"!=="常用于case表達式的判別,又稱作case等式運算符。其結果只能為0和1。如果操作數中存在x和z,那么操作數必須完全相同結果才為1,否則為0。
注意"=="和"="是完全不同的,"="是對寄存器賦值使用的。
(6)移位運算符
| 移位運算符 | 說明 |
| << | 左移 |
| >> | 右移 |
a>>n中a代表要進行向右移位的操作數,n代表要移幾位。a<<n表示將a邏輯左移n位。
這兩種移位運算都用0來填補移出的空位。
例如a是一個5位的寄存器,那么a=4'b1001<<1,a的結果就是5'b10010。但是當a是一個4位的寄存器,那么a=4'b1001<<1,a的結果就是4'b0010。
(7)條件運算符
用法: assign wire類型變量=條件?表達式1:表達式2;
如果滿足條件,變量=表達式1,否則,變量=表達式2
(8)拼位運算符
使用拼接運算符可以將變量任意組合后輸出或送給另一個變量。
用法:{信號1的某幾位,信號2的某幾位,......信號n的某幾位}
{m,-a,b[3:0],w,3'b101}等同于{a,b[3],b[2],b[1],b[0],w,1b'[1],1'b[0],1'b[1]}
{4{w}}等同于{w,w,w,w}
{b{3{a,b}}等同于{b,a,b,a,b,a,b}
?4 、語句
(1)賦值語句
?(2)結構說明語句(always+initial)
?
?ps:
?
(3)if語句?
?
?
?(4)case語句
?
?
?(5)循環語句(repeat+forever+while+for)
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的Verilog HDL语言总结(全)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql:InnoDB关键特性:自适应
- 下一篇: 0.5mm的焊锡丝能吃多大电流_施工要用