專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

Verilog HDL的基本語(yǔ)法

作者:kb129   來(lái)源:kb129的空間   點(diǎn)擊數(shù):  更新時(shí)間:2014年06月08日   【字體:
I/O聲明

  1. 輸入聲明

input[msb:lsb]端口1,端口2,端口3,……

  1. 輸出聲明

output[msb:lsb]端口1,端口2,端口3,……

  1. 輸入輸出聲明

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

  1. 用initial塊實(shí)現(xiàn),與always塊語(yǔ)句類(lèi)似,不過(guò)在程序中initial塊語(yǔ)句只能被執(zhí)行一次,一般用于電路的初始化

常量

  1. 整形常量

x:未知,z:高阻

6'B10X1Z0 //6位二進(jìn)制數(shù)

92 //十進(jìn)制數(shù)

'H67 //位寬為32位的十六進(jìn)制數(shù)

5'O37 //5位八進(jìn)制數(shù)

  1. 實(shí)行常量

7.56 ,34.56e2 6E-2

  1. 字符串常量

"hello!"

\n換行符

\t制表符Tab鍵

\\符號(hào)\

\*符號(hào)*

\ddd 三位八進(jìn)制數(shù)表示的ASCII碼

%%符號(hào)%

  1. 參數(shù)常量

parameter PI=3.14,A=8'B10110101,WORD_LENGTH=16;

變量

  1. wire型

輸入、輸出信號(hào)在默認(rèn)情況下自動(dòng)定義為wire型

wire[msb:lsb]變量1,變量2,…,變量n

eg.wire[7:0]m,n;

  1. reg型

reg[msb:lsb]變量1,變量2,…,變量n

eg.reg[7:0]m,n;

reg型變量和wire型變量的區(qū)別是:wire型變量需要持續(xù)地驅(qū)動(dòng),而reg型變量保持最后一次的賦值

  1. 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;

  1. 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ù)組

  1. time型

time類(lèi)型用于儲(chǔ)存和處理時(shí)間,是64位無(wú)符號(hào)數(shù)

time 變量1,變量2,…,變量n;

  1. real型

real型是64位帶符號(hào)實(shí)型變量,用于儲(chǔ)存和處理實(shí)型數(shù)據(jù)

real 變量1,變量2,…,變量n;

運(yùn)算符

  1. 算術(shù)運(yùn)算符

+,-,*,/,%

  1. 邏輯運(yùn)算符

&&,||,!

  1. 關(guān)系運(yùn)算符

<,<=,>,>=

  1. 等值運(yùn)算符

==邏輯相等,!=邏輯不等(可能為1,0,x),===全等(按位比較),!==非全等

  1. 位運(yùn)算符

~,&,~&,|,~|,^(異或),~^(同或)

  1. 縮減運(yùn)算符

~,&,~&,|,~|,^(異或),~^(同或)

縮減運(yùn)算符與邏輯運(yùn)算符的法則是一樣的,但縮減運(yùn)算符是對(duì)單一操作數(shù)按位進(jìn)行邏輯遞推運(yùn)算的,運(yùn)算結(jié)果為1位二進(jìn)制數(shù)。

  1. 移位運(yùn)算符

>>,<<

eg.

i=8;

m=3;

i<<m;//結(jié)果為64

i>>m;//結(jié)果為1

  1. 條件運(yùn)算符

條件? 表達(dá)式1:表達(dá)式2

eg.

a=10,b=20;

y=a>b?a:b;

  1. 拼接運(yùn)算符

X={a[7:4],b[3],c[2:0]};

  1. 運(yùn)算符的優(yōu)先級(jí)

賦值語(yǔ)句

  1. 連續(xù)賦值語(yǔ)句

連續(xù)賦值語(yǔ)句用來(lái)驅(qū)動(dòng)wire型變量,這個(gè)變量必須事先定義過(guò)。

eg.

wire a,b,c;

assign c=a&b;

  1. 過(guò)程賦值語(yǔ)句

過(guò)程賦值語(yǔ)句是在initial或者always語(yǔ)句塊內(nèi)賦值的,它對(duì)reg型、memory型、integer型、time型、real型變量進(jìn)行賦值,這些變量在下一次過(guò)程賦值之前保持原來(lái)的值。

  1. 阻塞型賦值

在該語(yǔ)句結(jié)束時(shí)就完成賦值操作

變量=賦值語(yǔ)句;

  1. 非阻塞型賦值

在塊結(jié)束時(shí)才完成賦值操作

變量<=賦值語(yǔ)句;

條件語(yǔ)句

  1. if else語(yǔ)句
  2. case語(yǔ)句

case(控制表達(dá)式)

    分支表達(dá)式1:語(yǔ)句1;

分支表達(dá)式2:語(yǔ)句2;

分支表達(dá)式3:語(yǔ)句3;

分支表達(dá)式m:語(yǔ)句m;

    default:語(yǔ)句n

endcase

循環(huán)語(yǔ)句

  1. forever循環(huán)語(yǔ)句

forever循環(huán)語(yǔ)句常用語(yǔ)產(chǎn)生周期性的波形,與always不同的地方在于它不能獨(dú)立寫(xiě)在程序中,必須寫(xiě)在initial塊中,常用于產(chǎn)生仿真測(cè)試信號(hào)。

eg.

initial

begin

    clock = 0;

    # 5 forever

    # 10 clock = ~ clock;

end

  1. repeat循環(huán)語(yǔ)句

repeat循環(huán)語(yǔ)句是用于執(zhí)行指定循環(huán)次數(shù)的過(guò)程語(yǔ)句,格式如下:

repeat(表達(dá)式)語(yǔ)句

eg.

initial

begin

    s=0;

    i=1;

    repeat(100)

    begin

        s=s+i;

        i=i+1

    end

end

  1. while循環(huán)語(yǔ)句

while循環(huán)執(zhí)行過(guò)程中賦值語(yǔ)句直到指定的條件為假

  1. for循環(huán)語(yǔ)句

結(jié)構(gòu)聲明語(yǔ)句

  1. initial說(shuō)明語(yǔ)句

initial語(yǔ)句常用于對(duì)各變量的初始化,一個(gè)程序模塊中可以有多個(gè)initial語(yǔ)句,所有的initial語(yǔ)句在程序一開(kāi)始同時(shí)執(zhí)行,并且只執(zhí)行一次。

  1. 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

    count=count+1b'1;

end

  1. task說(shuō)明語(yǔ)句

任務(wù)類(lèi)似于高級(jí)語(yǔ)言中的子程序,用來(lái)單獨(dú)完成某項(xiàng)任務(wù),并被其他模塊或者其他任務(wù)調(diào)用。

  1. 任務(wù)定義

task 任務(wù)名;

    端口聲明語(yǔ)句;

    類(lèi)型聲明語(yǔ)句;

    語(yǔ)句;

endtask

  1. 任務(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ù)不受限制

  1. function說(shuō)明語(yǔ)句

function語(yǔ)句用來(lái)定義函數(shù),單獨(dú)完成某項(xiàng)具體的 操作。

  1. 函數(shù)的定義

function <返回值得類(lèi)型或范圍> 函數(shù)名;

    端口聲明語(yǔ)句;

    類(lèi)型聲明語(yǔ)句;

    語(yǔ)句;

endfunction

  1. 函數(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ǔ)句

  1. 宏定義('define和'undef)

eg.

'define BYTE 8

wire ['BYTE-1:0]bus;

'undef BYTE

  1. 文件包含('include)

eg.

'include "d:\eda\s1.v"

  1. 時(shí)間尺度('timescale)

eg.

'timescal 10ns/100ps

always #1.55 clock=~clock;

  1. 條件編譯('ifdef,'else,'endif)

eg.

'ifdef COMPUTER_SIZE-PC

    parameter WORD_SIZE=16

'else

    parameter WORD_SIZE=32

'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

關(guān)閉窗口

相關(guān)文章