- 輸入聲明
input[msb:lsb]端口1,端口2,端口3,……
- 輸出聲明
output[msb:lsb]端口1,端口2,端口3,……
- 輸入輸出聲明
inout[msb:lsb]端口1,端口2,端口3,……
信號(hào)類(lèi)型聲明
常用的信號(hào)類(lèi)型有連線性(wire)、寄存器型(reg)、整形(integer)、實(shí)型(real)、時(shí)間型(time)等
功能描述
1.用assign語(yǔ)句實(shí)現(xiàn) eg.assgin a=b&c;
2.用實(shí)例元件實(shí)現(xiàn) eg. and u1(q,a,b) 其中a,b為輸入,q為輸出
3.用always塊實(shí)現(xiàn)帶有異步清除端的D觸發(fā)器
always @(posedge clk or posedge clr)
begin
if(clk)q<=0;
else q<=d;
end
- 用initial塊實(shí)現(xiàn),與always塊語(yǔ)句類(lèi)似,不過(guò)在程序中initial塊語(yǔ)句只能被執(zhí)行一次,一般用于電路的初始化
常量
- 整形常量
x:未知,z:高阻
6'B10X1Z0 //6位二進(jìn)制數(shù)
92 //十進(jìn)制數(shù)
'H67 //位寬為32位的十六進(jìn)制數(shù)
5'O37 //5位八進(jìn)制數(shù)
- 實(shí)行常量
7.56 ,34.56e2 6E-2
- 字符串常量
"hello!"
\n換行符
\t制表符Tab鍵
\\符號(hào)\
\*符號(hào)*
\ddd 三位八進(jìn)制數(shù)表示的ASCII碼
%%符號(hào)%
- 參數(shù)常量
parameter PI=3.14,A=8'B10110101,WORD_LENGTH=16;
變量
- wire型
輸入、輸出信號(hào)在默認(rèn)情況下自動(dòng)定義為wire型
wire[msb:lsb]變量1,變量2,…,變量n
eg.wire[7:0]m,n;
- reg型
reg[msb:lsb]變量1,變量2,…,變量n
eg.reg[7:0]m,n;
reg型變量和wire型變量的區(qū)別是:wire型變量需要持續(xù)地驅(qū)動(dòng),而reg型變量保持最后一次的賦值
- memory型
memory型是存儲(chǔ)器型,是通過(guò)建立reg型數(shù)組來(lái)描述的
eg.
reg[8:1]RAM[3:0];
RAM[0]=8'H1A;
RAM[1]=8'H00;
RAM[2]=8'H55;
RAM[3]=8'H31;
- integer型
integer是32位帶符號(hào)整形變量,用于對(duì)循環(huán)控制變量的說(shuō)明,典型應(yīng)用是高層次的行為建模,它與后面的time和real類(lèi)型一樣是不可綜合的,也就是說(shuō)這些類(lèi)型是數(shù)學(xué)的抽象描述,不與任何物理電路相對(duì)應(yīng)。
eg.integer d[1:8];//定義了一個(gè)含有8個(gè)數(shù)據(jù)的整形數(shù)組
- time型
time類(lèi)型用于儲(chǔ)存和處理時(shí)間,是64位無(wú)符號(hào)數(shù)
time 變量1,變量2,…,變量n;
- real型
real型是64位帶符號(hào)實(shí)型變量,用于儲(chǔ)存和處理實(shí)型數(shù)據(jù)
real 變量1,變量2,…,變量n;
運(yùn)算符
- 算術(shù)運(yùn)算符
+,-,*,/,%
- 邏輯運(yùn)算符
&&,||,!
- 關(guān)系運(yùn)算符
<,<=,>,>=
- 等值運(yùn)算符
==邏輯相等,!=邏輯不等(可能為1,0,x),===全等(按位比較),!==非全等
- 位運(yùn)算符
~,&,~&,|,~|,^(異或),~^(同或)
- 縮減運(yùn)算符
~,&,~&,|,~|,^(異或),~^(同或)
縮減運(yùn)算符與邏輯運(yùn)算符的法則是一樣的,但縮減運(yùn)算符是對(duì)單一操作數(shù)按位進(jìn)行邏輯遞推運(yùn)算的,運(yùn)算結(jié)果為1位二進(jìn)制數(shù)。
- 移位運(yùn)算符
>>,<<
eg.
i=8;
m=3;
i<<m;//結(jié)果為64
i>>m;//結(jié)果為1
- 條件運(yùn)算符
條件? 表達(dá)式1:表達(dá)式2
eg.
a=10,b=20;
y=a>b?a:b;
- 拼接運(yùn)算符
X={a[7:4],b[3],c[2:0]};
- 運(yùn)算符的優(yōu)先級(jí)
賦值語(yǔ)句
- 連續(xù)賦值語(yǔ)句
連續(xù)賦值語(yǔ)句用來(lái)驅(qū)動(dòng)wire型變量,這個(gè)變量必須事先定義過(guò)。
eg.
wire a,b,c;
assign c=a&b;
- 過(guò)程賦值語(yǔ)句
過(guò)程賦值語(yǔ)句是在initial或者always語(yǔ)句塊內(nèi)賦值的,它對(duì)reg型、memory型、integer型、time型、real型變量進(jìn)行賦值,這些變量在下一次過(guò)程賦值之前保持原來(lái)的值。
- 阻塞型賦值
在該語(yǔ)句結(jié)束時(shí)就完成賦值操作
變量=賦值語(yǔ)句;
- 非阻塞型賦值
在塊結(jié)束時(shí)才完成賦值操作
變量<=賦值語(yǔ)句;
條件語(yǔ)句
- if else語(yǔ)句
- case語(yǔ)句
case(控制表達(dá)式)
分支表達(dá)式2:語(yǔ)句2;
分支表達(dá)式3:語(yǔ)句3;
…
分支表達(dá)式m:語(yǔ)句m;
endcase
循環(huán)語(yǔ)句
- forever循環(huán)語(yǔ)句
forever循環(huán)語(yǔ)句常用語(yǔ)產(chǎn)生周期性的波形,與always不同的地方在于它不能獨(dú)立寫(xiě)在程序中,必須寫(xiě)在initial塊中,常用于產(chǎn)生仿真測(cè)試信號(hào)。
eg.
initial
begin
end
- repeat循環(huán)語(yǔ)句
repeat循環(huán)語(yǔ)句是用于執(zhí)行指定循環(huán)次數(shù)的過(guò)程語(yǔ)句,格式如下:
repeat(表達(dá)式)語(yǔ)句
eg.
initial
begin
end
- while循環(huán)語(yǔ)句
while循環(huán)執(zhí)行過(guò)程中賦值語(yǔ)句直到指定的條件為假
- for循環(huán)語(yǔ)句
結(jié)構(gòu)聲明語(yǔ)句
- initial說(shuō)明語(yǔ)句
initial語(yǔ)句常用于對(duì)各變量的初始化,一個(gè)程序模塊中可以有多個(gè)initial語(yǔ)句,所有的initial語(yǔ)句在程序一開(kāi)始同時(shí)執(zhí)行,并且只執(zhí)行一次。
- always說(shuō)明語(yǔ)句
always語(yǔ)句和initial語(yǔ)句一樣可以有多個(gè)always語(yǔ)句,always語(yǔ)句也是在程序一開(kāi)始的時(shí)候就被執(zhí)行,不同的是always語(yǔ)句不斷重復(fù)運(yùn)行。但是always語(yǔ)句后跟的語(yǔ)句是否執(zhí)行,要看其敏感事件列表是否滿足,若有條件滿足,則運(yùn)行一次語(yǔ)句。電平觸發(fā)的always塊常用于說(shuō)明組合邏輯的行為,而在邊沿觸發(fā)的always塊常用于描述時(shí)序行為。
eg.
reg[7:0] count
always @(posedge clk)
begin
end
- task說(shuō)明語(yǔ)句
任務(wù)類(lèi)似于高級(jí)語(yǔ)言中的子程序,用來(lái)單獨(dú)完成某項(xiàng)任務(wù),并被其他模塊或者其他任務(wù)調(diào)用。
- 任務(wù)定義
task 任務(wù)名;
endtask
- 任務(wù)調(diào)用
任務(wù)名(端口名列表);
任務(wù)的定義和調(diào)用必須在同一個(gè)模塊內(nèi)
任務(wù)定義時(shí),task語(yǔ)句后沒(méi)有端口名列表,輸入輸出端口名是通過(guò)端口聲明語(yǔ)句進(jìn)行順序聲明的;一個(gè)任務(wù)也可以沒(méi)有輸入輸出端口
當(dāng)任務(wù)被調(diào)用時(shí),任務(wù)被激活,如果一個(gè)任務(wù)有輸入輸出端口,調(diào)用時(shí)需列出端口名列表,其順序和類(lèi)型應(yīng)該與任務(wù)定義中的完全一致
進(jìn)行任務(wù)調(diào)用時(shí)參數(shù)的傳遞是按值傳遞的,不能按地址傳遞
一個(gè)任務(wù)可以調(diào)用別的任務(wù)或函數(shù),可調(diào)用的任務(wù)和函數(shù)的個(gè)數(shù)不受限制
- function說(shuō)明語(yǔ)句
function語(yǔ)句用來(lái)定義函數(shù),單獨(dú)完成某項(xiàng)具體的 操作。
- 函數(shù)的定義
function <返回值得類(lèi)型或范圍> 函數(shù)名;
endfunction
- 函數(shù)的調(diào)用
函數(shù)名(端口名列表)
函數(shù)只能有一個(gè)返回值,而任務(wù)可以有多個(gè)或者沒(méi)有返回值。
函數(shù)至少有一個(gè)輸入變量
函數(shù)只能與主模塊共用一個(gè)仿真時(shí)間,而任務(wù)可以定義自己的仿真時(shí)間單位
函數(shù)不能調(diào)用任務(wù),而任務(wù)能調(diào)用其他函數(shù)或任務(wù)
編譯預(yù)處理語(yǔ)句
- 宏定義('define和'undef)
eg.
'define BYTE 8
…
wire ['BYTE-1:0]bus;
…
'undef BYTE
- 文件包含('include)
eg.
'include "d:\eda\s1.v"
- 時(shí)間尺度('timescale)
eg.
'timescal 10ns/100ps
…
always #1.55 clock=~clock;
- 條件編譯('ifdef,'else,'endif)
eg.
'ifdef COMPUTER_SIZE-PC
'else
'endif
模塊化設(shè)計(jì)
module count_dec(clk,clr,en,cout,q);
input clk,clr,en;
output [15:0]q;
output cout;
reg[15:0]q;
reg cout;
wire[3:0]q1,q2;
wire x;
count4 u1(clk,clr,en,x,q1);
count4 u2(clk,clr,x,cout,q2);
dec_seg7 u3(q1,q[7:0]);
dec_seg7 u4(q2,q[15:8]);
endmoudle