0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

FPGA編程語言——verilog語法詳解

ZYNQ ? 來源:ZYNQ ? 2023-02-02 10:03 ? 次閱讀

	

Verilog語法的基本概念

一、Verilog HDL

Verilog HDL是一種用于數(shù)字系統(tǒng)設(shè)計(jì)的語言。用Verilog HDL描述的電路設(shè)計(jì)就是該電路的Verilog HDL模型也稱為模塊。Verilog HDL既是一種行為描述的語言也是一種結(jié)構(gòu)描述的語言。這也就是說,無論描述電路功能行為的模塊或描述元器件或較大部件互連的模塊都可以用Verilog語言來建立電路模型。如果按照一定的規(guī)矩編寫,功能行為模塊可以通過工具自動(dòng)地轉(zhuǎn)換為門級(jí)互連模塊。Verilog模型可以是實(shí)際電路的不同級(jí)別的抽象。這些抽象的級(jí)別和它們對(duì)應(yīng)的模型類型共有以下五種:

1.1系統(tǒng)級(jí)(system): 用語言提供的高級(jí)結(jié)構(gòu)實(shí)現(xiàn)設(shè)計(jì)模塊外部性能的模型。

1.2 算法級(jí)(algorithm): 用語言提供的高級(jí)結(jié)構(gòu)實(shí)現(xiàn)算法運(yùn)行的模型。

1.3 RTL級(jí)(Register Transfer Level):描述數(shù)據(jù)在寄存器之間流動(dòng)和如何處理和控制這些數(shù)據(jù)流動(dòng)的模型。

1.4 門級(jí)(gate-level):描述邏輯門以及邏輯門之間的連接的模型。

1.5 開關(guān)級(jí)(switch-level):描述器件中三極管和儲(chǔ)存節(jié)點(diǎn)以及它們之間連接的模型。

二、Verilog HDL模塊

一個(gè)復(fù)雜電路系統(tǒng)的完整Verilog HDL模型是由若干個(gè)Verilog HDL模塊構(gòu)成的,每一個(gè)模塊又可以由若干個(gè)子模塊構(gòu)成。其中有些模塊需要綜合成具體電路,而有些模塊只是與用戶所設(shè)計(jì)的模塊有交互聯(lián)系的現(xiàn)存電路或激勵(lì)信號(hào)源。利用Verilog HDL語言結(jié)構(gòu)所提供的這種功能就可以構(gòu)造一個(gè)模塊間的清晰層次結(jié)構(gòu)來描述極其復(fù)雜的大型設(shè)計(jì),并對(duì)所作設(shè)計(jì)的邏輯電路進(jìn)行嚴(yán)格的驗(yàn)證。

Verilog HDL行為描述語言作為一種結(jié)構(gòu)化和過程性的語言,其語法結(jié)構(gòu)非常適合于算法級(jí)和RTL級(jí)的模型設(shè)計(jì)。這種行為描述語言具有以下功能:

(1) 可描述順序執(zhí)行或并行執(zhí)行的程序結(jié)構(gòu)。

(2) 用延遲表達(dá)式或事件表達(dá)式來明確地控制過程的啟動(dòng)時(shí)間。

(3)通過命名的事件來觸發(fā)其它過程里的激活行為或停止行為。

(4) 提供了條件、if-else、case、循環(huán)程序結(jié)構(gòu)。

(5) 提供了可帶參數(shù)且非零延續(xù)時(shí)間的任務(wù)(task)程序結(jié)構(gòu)。

(6) 提供了可定義新的操作符的函數(shù)結(jié)構(gòu)(function)。

(7) 提供了用于建立表達(dá)式的算術(shù)運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符。

Verilog HDL作為一種高級(jí)的硬件描述編程語言,與C語言的風(fēng)格有許多類似之處。其中有許多語句如:if語句、case語句等和C語言中的對(duì)應(yīng)語句十分相似。如果讀者已經(jīng)掌握C語言編程的基礎(chǔ),那么學(xué)習(xí)Verilog HDL并不困難。我們只要對(duì)Verilog HDL某些語句的特殊方面著重理解,并加強(qiáng)上機(jī)練習(xí)就能很好地掌握它,就能利用它的強(qiáng)大功能來設(shè)計(jì)復(fù)雜的數(shù)字邏輯電路系統(tǒng)。

2.1 簡(jiǎn)單的Verilog HDL模塊

2.1.1 Verilog語法簡(jiǎn)介

下面先介紹一個(gè)個(gè)簡(jiǎn)單的Verilog HDL程序,從中了解Verilog模塊的特性。

module test_project_top( //模塊名

input clk, //時(shí)鐘輸入

input resetn, //復(fù)位

input[7:0] a, //信號(hào)輸入,信號(hào)a 位寬為8 bit

input[7:0] b, //信號(hào)輸入,信號(hào)b 位寬為8 bit

input en, //信號(hào)是能輸入 信號(hào)en 位寬為1 bit

output reg [8:0] c, //寄存器類型定義,信號(hào)輸出 c為9bit

output reg [15:0] d //寄存器類型定義,信號(hào)輸出 d 為16bit

);

/*........*/ //.........表示注釋部分,注釋只是為了方便程序員理解程序,對(duì)編譯是不起作用的。

/*一個(gè) .v文件中主要由 一個(gè)或多個(gè) module ... endmodule塊組成

每個(gè)module塊內(nèi)包括:模塊名,輸入端口,輸出端口,以及多個(gè)時(shí)序電路,組合電路等組成

*/

//簡(jiǎn)單的時(shí)序電路組成

always@(posedge clk or negedge resetn)

begin

if(~resetn) //或者 if(!resetn) 取 resetn 反

begin

d<=16'h0;

end

else

begin

if(en) // if en ==1那么 d等于a*b+a/b;否則d<=0

d<=a*b+a/b; // +?, - ,* ,/ 加減乘除

else

d<=0;

end

end

//簡(jiǎn)單的組合電路

always@(a or b) //只要其中a或b一個(gè)變化就執(zhí)行always塊內(nèi)語句

begin

if(en) // verilog語法 if ... else ...,在組合電路中一個(gè)if對(duì)應(yīng)一個(gè)else,不能缺else,防止產(chǎn)生鎖存器

c<=a*b+a/b;

else

c<=0;

end

wire[8:0] sum; //常見變量定義類型:wire-線網(wǎng)型,reg-寄存器

assign sum =a+b; //組合電路賦值,關(guān)鍵字 assign

wire[15:0] multy;

assign multy = (en ) ? a*b :0;//如果 en ==1,那么 multy =a*b,否則multy =0;

wire e;

assign e =&a; // &按位與

wire f;

assign f =|b;// |按位或

wire [8:0] c_sum;

//實(shí)例化模塊

my_add u_add_top( // my_add模塊名 ,u_add_top 實(shí)例化名

.clk(clk), //端口連接輸入

.resetn(resetn),//端口連接輸入

.a(a),//端口連接輸入

.b(b),//端口連接輸入

.c(c_sum)//端口連接輸出

);

endmodule

這個(gè)小程序表述了一個(gè).v文件包含了常用的verilog語法,變量的定義類型包括:wire,reg等,常見的運(yùn)算符號(hào)跟C語言中相同,理解較容易。在這個(gè)例子中存在著兩個(gè)模塊。模塊test_project_top引用由模塊my_add定義的實(shí)例部件u_add_top。模塊test_project_top是頂層模塊。模塊my_add則被稱為子模塊。在實(shí)例部件u_add_top中,帶 “.”的表示被引用模塊的端口,名稱必須與被引用模塊my_add的端口定義一致,小括號(hào)中表示在本模塊中與之連接的線路。

2.1.2 Verilog用于模塊的測(cè)試

Verilog 還可以用來描述變化的測(cè)試信號(hào)。描述測(cè)試信號(hào)的變化和測(cè)試過程的模塊也叫做測(cè)試平臺(tái)(Testbench 或Testfixture),它可以對(duì)上面介紹的電路模塊(無論是行為的或結(jié)構(gòu)的)進(jìn)行動(dòng)態(tài)的全面測(cè)試。通過觀測(cè)被測(cè)試模塊的輸出信號(hào)是否符合要求,可以調(diào)試和驗(yàn)證邏輯系統(tǒng)的設(shè)計(jì)和結(jié)構(gòu)正確與否,發(fā)現(xiàn)問題及時(shí)修改。

下面我們來看一個(gè)Verilog的測(cè)試模塊,

//測(cè)試激勵(lì)產(chǎn)生

`timescale 1ns / 1ps

module test_project_top_tb; //測(cè)試文件模塊名

//信號(hào)測(cè)試激勵(lì),輸入變量聲明

reg clk ;

reg reset;

reg [7:0] a;

reg [7:0] b;

reg en;

//輸出變量聲明

wire[8:0] c;

wire [15:0] d;

//信號(hào)變量初始化 ,關(guān)鍵字 initial

initial

begin

clk =0;

reset =0;

a =0;

b =0;

en =0;

#1000; //在1000 ns后 reset拉高

reset =1;

end

//時(shí)鐘生成

always #5 clk =~clk; //時(shí)鐘周期 10ns ,每隔5ns 取反一次

always @(posedge clk)

begin // {$random}為系統(tǒng)任務(wù),它會(huì)產(chǎn)生一個(gè)隨機(jī)數(shù)

#1 a= {$random}%256; //產(chǎn)生隨機(jī)的位信號(hào)流a和b ,%256為做模256運(yùn)算

#3 b = {$random}%256; //分別延遲1和3個(gè)時(shí)間單位后產(chǎn)生隨機(jī)的位信號(hào)流a 和b

end

always #10000 en = !en; //產(chǎn)生周期為10000個(gè)單位時(shí)間的選通信號(hào)變化

//實(shí)例化 被測(cè)試模塊

test_project_top u_top(

.clk(clk), //時(shí)鐘輸入

.resetn(reset), //復(fù)位

.a(a), //信號(hào)輸入,信號(hào)a 位寬為8 bit

.b(b), //信號(hào)輸入,信號(hào)b 位寬為8 bit

.en(en), //信號(hào)是能輸入 信號(hào)en 位寬為1 bit

.c(c), //寄存器類型定義,信號(hào)輸出 c為9bit

.d(d) //寄存器類型定義,信號(hào)輸出 d 為16bit

);

endmodule

本測(cè)試?yán)淌菍?duì)2.1.1中的小程序的測(cè)試,屬于RTL級(jí)功能仿真,主要調(diào)試語法及時(shí)序信號(hào)是否跟設(shè)計(jì)時(shí)一致。對(duì)于初學(xué)者來說,這是最基本的技能,必須熟練掌握。

ecad6f98-a299-11ed-bfe3-dac502259ad0.jpg

圖1 仿真時(shí)序圖

2.1.3 總結(jié):

通過上面這些的例子可以看到以下幾點(diǎn):

(1) Verilog HDL程序是由模塊構(gòu)成的。每個(gè)模塊的內(nèi)容都是位于module和endmodule兩個(gè)語句之間,每個(gè)模塊實(shí)現(xiàn)特定的功能。

(2) 模塊是可以進(jìn)行層次嵌套的。正因?yàn)槿绱?才可以將大型的數(shù)字電路設(shè)計(jì)分割成不同的小模塊來實(shí)現(xiàn)特定的功能。

(3) 每個(gè)模塊都是可以綜合的,通過綜合工具可以把它們的功能描述全都轉(zhuǎn)換為最基本的邏輯單元描述,最后可以用一個(gè)上層模塊通過實(shí)例引用把這些模塊連接起來,把它們整合成一個(gè)很大的邏輯系統(tǒng)。

(4) Verilog 模塊可以分為兩種類型:一種是為了讓模塊最終能生成電路結(jié)構(gòu),另一種只是為了測(cè)試所設(shè)計(jì)的電路其邏輯功能是否正確。

(5) 每個(gè)模塊要進(jìn)行端口定義,并說明輸入輸出口,然后對(duì)模塊的功能進(jìn)行 描述。

(6) Verilog HDL程序的書寫格式自由,一行可以寫幾個(gè)語句,一個(gè)語句也可以分寫多行。

(7) 除了endmodule語句外,每個(gè)語句和數(shù)據(jù)定義的最后必須有分號(hào)。

(8) 可以用/*.....*/和//.......對(duì)Verilog HDL程序的任何部分作注釋。一個(gè)好的,有使用價(jià)值的源程序都應(yīng)當(dāng)加上必要的注釋,以增強(qiáng)程序的可讀性和可維護(hù)性。

第三章verilog語法進(jìn)階

三、模塊的結(jié)構(gòu)、數(shù)據(jù)類型、變量和基本運(yùn)算符號(hào)

3.1 模塊的結(jié)構(gòu)

Verilog的基本設(shè)計(jì)單元是“模塊”(block)。一個(gè)模塊是由兩部分組成的,一部分描述接口,另一部分描述邏輯功能,即定義輸入是如何影響輸出的。下面舉例說明:

ecbf7238-a299-11ed-bfe3-dac502259ad0.jpg

圖2 模塊簡(jiǎn)圖

請(qǐng)看上面的例子: 程序模塊旁邊有一個(gè)電路圖的符號(hào)。在許多方面,程序模塊和電路圖符號(hào)是一致的,這是因?yàn)殡娐穲D符號(hào)的引腳也就是程序模塊的接口。而程序模塊描述了電路圖符號(hào)所實(shí)現(xiàn)的邏輯功能。以上就是設(shè)計(jì)一個(gè)簡(jiǎn)單的Verilog程序模塊所需的全部?jī)?nèi)容。從上面的例子可以看出,Verilog結(jié)構(gòu)位于在module和endmodule聲明語句之間,每個(gè)Verilog程序包括四個(gè)主要部分:端口定義、I/O說明、內(nèi)部信號(hào)聲明、功能定義。

3.1.1 模塊的端口定義

模塊的端口聲明了模塊的輸入輸出口。其格式如下:

module模塊名(口1,口2,口3,口4, ………);

…….

endmodule

模塊的端口表示的是模塊的輸入和輸出口名,也就是它與別的模塊聯(lián)系端口的標(biāo)識(shí)。在模塊被引用時(shí),在引用的模塊中,有些信號(hào)要輸入到被引用的模塊中,有的信號(hào)需要從被引用的模塊中取出來。在引用模塊時(shí)其端口可以用兩種方法連接:

1)在引用時(shí),嚴(yán)格按照模塊定義的端口順序來連接,不用標(biāo)明原模塊定義時(shí)規(guī)定的端口名,舉例說明如下:

模塊名 實(shí)例化名( 連接端口1信號(hào)名, 連接端口2信號(hào)名,連接端口3信號(hào)名,….,,,);

2)在引用時(shí)用“.”標(biāo)明原模塊定義時(shí)規(guī)定的端口名,舉例說明如下:

模塊名 實(shí)例化名(.端口1名( 連接信號(hào)1名),.端口2名( 連接信號(hào)2名),….,,,);

這樣表示的好處在于可以用端口名與被引用模塊的端口對(duì)應(yīng),不必嚴(yán)格按端口順序?qū)?yīng),提高了程序的可讀性和可移植性。

3.1.2 模塊內(nèi)容

模塊的內(nèi)容包括I/O說明、內(nèi)部信號(hào)聲明、功能定義。

3.1.2.1 I/O說明的格式如下:

輸入口:input [信號(hào)位寬-1 :0] 端口名1;

input [信號(hào)位寬-1 :0] 端口名2;

………;

input [信號(hào)位寬-1 :0] 端口名i; //(共有i個(gè)輸入口)

輸出口:output [信號(hào)位寬-1 :0] 端口名1;

output [信號(hào)位寬-1 :0] 端口名2;

………;

output [信號(hào)位寬-1 :0] 端口名j; //(共有j個(gè)輸出口)

輸入/輸出口:

inout [信號(hào)位寬-1 :0] 端口名1;

inout [信號(hào)位寬-1 :0] 端口名2;

………;

inout [信號(hào)位寬-1 :0] 端口名k; //(共有k個(gè)雙向總線端口)

I/O說明也可以寫在端口聲明語句里。其格式如下:

module module_name(input port1,input port2,…

output port1,output port2… );

3.1.2.2 內(nèi)部信號(hào)說明:

在模塊內(nèi)用到的和與端口有關(guān)的wire 和 reg 類型變量的聲明。如:

reg [width-1 : 0] R變量1,R變量2 。。。。;

wire [width-1 : 0] W變量1,W變量2 。。。。;

………..

3.1.2.3 功能定義:

模塊中最重要的部分是邏輯功能定義部分。有三種方法可在模塊中產(chǎn)生邏輯。

1)用“assign”聲明語句,如:assign a = b & c;

2)實(shí)例化模塊,如:and u1( q, a, b );

3)用“always”塊

如:always @(posedge clk or posedge clr)

begin

if(clr) q <= 0;

else if(en) q <= d;

end

采用“assign”語句是描述組合邏輯最常用的方法之一。而“always”塊既可用于描述組合邏輯也可描述時(shí)序邏輯。上面的例子用“always”塊生成了一個(gè)帶有異步清除端的D觸發(fā)器。“always”塊可用很多種描述手段來表達(dá)邏輯,例如上例中就用了if...else語句來表達(dá)邏輯關(guān)系。如按一定的風(fēng)格來編寫“always”塊,可以通過綜合工具把源代碼自動(dòng)綜合成用門級(jí)結(jié)構(gòu)表示的組合或時(shí)序邏輯電路。

3.1.3 理解要點(diǎn):

如果用Verilog模塊實(shí)現(xiàn)一定的功能,首先應(yīng)該清楚哪些是同時(shí)發(fā)生的,哪些是順序發(fā)生的。上面分別采用了“assign”語句、實(shí)例元件和“always”塊,描述的邏輯功能是同時(shí)執(zhí)行的。也就是說,如果把這三項(xiàng)寫到一個(gè) VeriIog 模塊文件中去,它們的次序不會(huì)影響邏輯實(shí)現(xiàn)的功能。這三項(xiàng)是同時(shí)執(zhí)行的,也就是并發(fā)的。

然而,在“always”模塊內(nèi),邏輯是按照指定的順序執(zhí)行的?!癮lways”塊中的語句稱為“順序語句”,因?yàn)樗鼈兪琼樞驁?zhí)行,所以“always”塊也稱作“過程塊”。請(qǐng)注意,兩個(gè)或更多的“always”語句塊,它們是同時(shí)執(zhí)行的,而模塊內(nèi)部的語句是順序執(zhí)行的。看一下“always”塊內(nèi)的語句,你就會(huì)明白它是如何實(shí)現(xiàn)功能的。if..else… if必須順序執(zhí)行,否則其功能就沒有任何意義。如果else語句在if語句之前執(zhí)行,其功能就會(huì)不符合要求!為了能實(shí)現(xiàn)上述描述的功能,“always”語句塊內(nèi)部的語句將按照書寫的順序執(zhí)行。

在Verilog 模塊中所有過程塊(如:initial塊、always塊)、連續(xù)賦值語句、實(shí)例引用都是并行的。它們表示的是一種通過變量名互相連接的關(guān)系。在同一模塊中這三者出現(xiàn)的先后次序沒有關(guān)系。只有連續(xù)賦值語句assign 和實(shí)例引用語句可以獨(dú)立于過程塊而存在于模塊的功能定義部分。以上是與C語言有很大的不同。許多與C語言類似的語句只能出現(xiàn)在過程塊中,而不能隨意出現(xiàn)在模塊功能定義的范圍內(nèi)。

3.2 數(shù)據(jù)類型及其常量、變量

Verilog HDL中總共有十九種數(shù)據(jù)類型,數(shù)據(jù)類型是用來表示數(shù)字電路硬件中的數(shù)據(jù)儲(chǔ)存和傳送元素的。先只介紹四個(gè)最基本的數(shù)據(jù)類型,它們是:reg型、wire型、integer型、parameter型。

其它數(shù)據(jù)類型也有很多:large型、medium型、scalared型、time型、small型、tri型、trio型、tri1型、triand型、trior型、trireg型、vectored型、wand型、wor型。

3.2.1 常量

在程序運(yùn)行過程中,其值不能被改變的量稱為常量。下面首先對(duì)在Verilog HDL語言中使用的數(shù)字及其表示方式進(jìn)行介紹。

3.2.1.1 整數(shù):

在Verilog HDL中,整型常量即整常數(shù)有以下四種進(jìn)制表示形式:

1) 二進(jìn)制整數(shù)(b或B)

2) 十進(jìn)制整數(shù)(d或D)

3) 十六進(jìn)制整數(shù)(h或H)

4) 八進(jìn)制整數(shù)(o或O)

3.2.1.2 x和z值:

在數(shù)字電路中,x代表不定值,z代表高阻值。一個(gè)x可以用來定義十六進(jìn)制數(shù)的四位二進(jìn)制數(shù)的狀態(tài),八進(jìn)制數(shù)的三位,二進(jìn)制數(shù)的一位。z的表示方式同x類似。z還有一種表達(dá)方式是可以寫作?。在使用case表達(dá)式時(shí)建議使用這種寫法,以提高程序的可讀性。見下例:

4'b10x0 //位寬為4的二進(jìn)制數(shù)從低位數(shù)起第二位為不定值

4'b101z //位寬為4的二進(jìn)制數(shù)從低位數(shù)起第一位為高阻值

12'dz //位寬為12的十進(jìn)制數(shù)其值為高阻值(第一種表達(dá)方式)

12'd? //位寬為12的十進(jìn)制數(shù)其值為高阻值(第二種表達(dá)方式)

8'h4x //位寬為8的十六進(jìn)制數(shù)其低四位值為不定值

3.2.1.3 負(fù)數(shù):

一個(gè)數(shù)字可以被定義為負(fù)數(shù),只需在位寬表達(dá)式前加一個(gè)減號(hào),減號(hào)必須寫在數(shù)字定義表達(dá)式的最前面。注意減號(hào)不可以放在位寬和進(jìn)制之間也不可以放在進(jìn)制和具體的數(shù)之間。如下:

-8'd5 //這個(gè)表達(dá)式代表5的補(bǔ)數(shù)(用八位二進(jìn)制數(shù)表示)

8'd-5 //非法格式

3.2.2 參數(shù)(Parameter)型

在Verilog HDL中用parameter來定義常量,即用parameter來定義一個(gè)標(biāo)識(shí)符代表一個(gè)常量,稱為符號(hào)常量,即標(biāo)識(shí)符形式的常量,采用標(biāo)識(shí)符代表一個(gè)常量可提高程序的可讀性和可維護(hù)性。parameter型數(shù)據(jù)是一種常數(shù)型的數(shù)據(jù),其說明格式如下:

parameter參數(shù)名1=表達(dá)式,參數(shù)名2=表達(dá)式, …,參數(shù)名n=表達(dá)式;

parameter是參數(shù)型數(shù)據(jù)的確認(rèn)符,確認(rèn)符后跟著一個(gè)用逗號(hào)分隔開的賦值語句表。在每一個(gè)賦值語句的右邊必須是一個(gè)常數(shù)表達(dá)式。也就是說,該表達(dá)式只能包含數(shù)字或先前已定義過的參數(shù)。見下列:

parameter msb=7; //定義參數(shù)msb為常量7

parameter e=25, f=29; //定義二個(gè)常數(shù)參數(shù)

parameter r=5.7; //聲明r為一個(gè)實(shí)型參數(shù)

parameter byte_size=8, byte_msb=byte_size-1; //用常數(shù)表達(dá)式賦值

parameter average_delay = (r+f)/2; //用常數(shù)表達(dá)式賦值

3.2.3 變量

3.2.3.1 wire型

wire型數(shù)據(jù)常用來表示用于以assign關(guān)鍵字指定的組合邏輯信號(hào)。Verilog程序模塊中輸入輸出信號(hào)類型缺省時(shí)自動(dòng)定義為wire型。wire型信號(hào)可以用作任何方程式的輸入,也可以用作“assign”語句或?qū)嵗妮敵觥?/span>

wire型信號(hào)的格式同reg型信號(hào)的很類似。其格式如下:

wire [n-1:0] 數(shù)據(jù)名1,數(shù)據(jù)名2,…數(shù)據(jù)名i;//共有i條總線,每條總線內(nèi)有n條線路

wire [n:1] 數(shù)據(jù)名1,數(shù)據(jù)名2,…數(shù)據(jù)名i;

wire是wire型數(shù)據(jù)的確認(rèn)符,[n-1:0]和[n:1]代表該數(shù)據(jù)的位寬,即該數(shù)據(jù)有幾位。最后跟著的是數(shù)據(jù)的名字。如果一次定義多個(gè)數(shù)據(jù),數(shù)據(jù)名之間用逗號(hào)隔開。聲明語句的最后要用分號(hào)表示語句結(jié)束。如下格式:

wire a; //定義了一個(gè)一位的wire型數(shù)據(jù)

wire [7:0] b; //定義了一個(gè)八位的wire型數(shù)據(jù)

wire [4:1] c, d; //定義了二個(gè)四位的wire型數(shù)據(jù)

3.2.3.2 reg型

寄存器是數(shù)據(jù)儲(chǔ)存單元的抽象。寄存器數(shù)據(jù)類型的關(guān)鍵字是reg。通過賦值語句可以改變寄存器儲(chǔ)存的值,其作用與改變觸發(fā)器儲(chǔ)存的值相當(dāng)。reg類型數(shù)據(jù)的缺省初始值為不定值,x。reg型只表示被定義的信號(hào)將用在“always”塊內(nèi)。

reg型數(shù)據(jù)常用來表示用于“always”模塊內(nèi)的指定信號(hào),常代表觸發(fā)器。通常,在設(shè)計(jì)中要由“always”塊通過使用行為描述語句來表達(dá)邏輯關(guān)系。在“always”塊內(nèi)被賦值的每一個(gè)信號(hào)都必須定義成reg型。

reg型數(shù)據(jù)的格式如下:

reg [n-1:0] 數(shù)據(jù)名1,數(shù)據(jù)名2,… 數(shù)據(jù)名i;

reg [n:1] 數(shù)據(jù)名1,數(shù)據(jù)名2,… 數(shù)據(jù)名i;

reg是reg型數(shù)據(jù)的確認(rèn)標(biāo)識(shí)符,[n-1:0]和[n:1]代表該數(shù)據(jù)的位寬,即該數(shù)據(jù)有幾位(bit)。最后跟著的是數(shù)據(jù)的名字。如果一次定義多個(gè)數(shù)據(jù),數(shù)據(jù)名之間用逗號(hào)隔開。聲明語句的最后要用分號(hào)表示語句結(jié)束。如下:

reg rega; //定義了一個(gè)一位的名為rega的reg型數(shù)據(jù)

reg [3:0] regb; //定義了一個(gè)四位的名為regb的reg型數(shù)據(jù)

reg [4:1] regc, regd; //定義了兩個(gè)四位的名為regc和regd的reg型數(shù)據(jù)

3.2.3.3 memory型

Verilog HDL通過對(duì)reg型變量建立數(shù)組來對(duì)存儲(chǔ)器建模,可以描述RAM型存儲(chǔ)器,ROM存儲(chǔ)器和reg文件。數(shù)組中的每一個(gè)單元通過一個(gè)數(shù)組索引進(jìn)行尋址。在Verilog語言中沒有多維數(shù)組存在。memory型數(shù)據(jù)是通過擴(kuò)展reg型數(shù)據(jù)的地址范圍來生成的。其格式如下:

reg [n-1:0]存儲(chǔ)器名[m-1:0];

或 reg [n-1:0] 存儲(chǔ)器名[m:1];

在這里,reg[n-1:0]定義了存儲(chǔ)器中每一個(gè)存儲(chǔ)單元的大小,即該存儲(chǔ)單元是一個(gè)n位的寄存器。存儲(chǔ)器名后的[m-1:0]或[m:1]則定義了該存儲(chǔ)器中有多少個(gè)這樣的寄存器。最后用分號(hào)結(jié)束定義語句。下面舉例說明:

reg [7:0] mema[255:0];

這個(gè)例子定義了一個(gè)名為mema的存儲(chǔ)器,該存儲(chǔ)器有256個(gè)8位的存儲(chǔ)器。該存儲(chǔ)器的地址范圍是0到255。注意:對(duì)存儲(chǔ)器進(jìn)行地址索引的表達(dá)式必須是常數(shù)表達(dá)式。

另外,在同一個(gè)數(shù)據(jù)類型聲明語句里,可以同時(shí)定義存儲(chǔ)器型數(shù)據(jù)和reg型數(shù)據(jù)。見下例:

parameter wordsize=16, //定義二個(gè)參數(shù)

memsize=256;

reg [wordsize-1:0] mem[memsize-1:0], writereg, readreg;

盡管memory型數(shù)據(jù)和reg型數(shù)據(jù)的定義格式很相似,但要注意其不同之處。如一個(gè)由n個(gè)1位寄存器構(gòu)成的存儲(chǔ)器組是不同于一個(gè)n位的寄存器的。見下例:

reg [n-1:0] rega; //一個(gè)n位的寄存器

reg mema [n-1:0]; //一個(gè)由n個(gè)1位寄存器構(gòu)成的存儲(chǔ)器組

一個(gè)n位的寄存器可以在一條賦值語句里進(jìn)行賦值,而一個(gè)完整的存儲(chǔ)器則不行。見下例:

rega =0; //合法賦值語句

mema =0; //非法賦值語句

如果想對(duì)memory中的存儲(chǔ)單元進(jìn)行讀寫操作,必須指定該單元在存儲(chǔ)器中的地址。下面的寫法是正確的。

mema[3]=0; //給memory中的第3個(gè)存儲(chǔ)單元賦值為0。

進(jìn)行尋址的地址索引可以是表達(dá)式,這樣就可以對(duì)存儲(chǔ)器中的不同單元進(jìn)行操作。表達(dá)式的值可以取決于電路中其它的寄存器的值。例如可以用一個(gè)加法計(jì)數(shù)器來做RAM的地址索引。

3.3 運(yùn)算符及表達(dá)式

Verilog HDL語言的運(yùn)算符范圍很廣,其運(yùn)算符按其功能可分為以下幾類:

1) 算術(shù)運(yùn)算符(+,-,×,/,%)

2) 賦值運(yùn)算符(=,<=)

3) 關(guān)系運(yùn)算符(>,<,>=,<=)

4) 邏輯運(yùn)算符(&&,||,!)

5) 條件運(yùn)算符(?:)

6) 位運(yùn)算符(~,|,^,&,^~)

7) 移位運(yùn)算符(<<,>>)

8) 拼接運(yùn)算符({ })

9) 其它

在Verilog HDL語言中運(yùn)算符所帶的操作數(shù)是不同的,按其所帶操作數(shù)的個(gè)數(shù)運(yùn)算符可分為三種:

1) 單目運(yùn)算符(unary operator):可以帶一個(gè)操作數(shù),操作數(shù)放在運(yùn)算符的右邊。

2) 二目運(yùn)算符(binary operator):可以帶二個(gè)操作數(shù),操作數(shù)放在運(yùn)算符的兩邊。

3) 三目運(yùn)算符(ternary operator):可以帶三個(gè)操作,這三個(gè)操作數(shù)用三目運(yùn)算符分隔開。

clock = ~clock; // ~是一個(gè)單目取反運(yùn)算符, clock是操作數(shù)。

c = a | b; // 是一個(gè)二目按位或運(yùn)算符, a 和 b是操作數(shù)。

r = s ? t : u; // ?: 是一個(gè)三目條件運(yùn)算符, s,t,u是操作數(shù)。

下面對(duì)常用的幾種運(yùn)算符進(jìn)行介紹。

3.3.1 基本的算術(shù)運(yùn)算符

在Verilog HDL語言中,算術(shù)運(yùn)算符又稱為二進(jìn)制運(yùn)算符,共有下面幾種:

1) + (加法運(yùn)算符,或正值運(yùn)算符,如 rega+regb,+3)

2) - (減法運(yùn)算符,或負(fù)值運(yùn)算符,如 rega-3,-3)

3) × (乘法運(yùn)算符,如rega*3)

4) / (除法運(yùn)算符,如5/3)

5) % (模運(yùn)算符,或稱為求余運(yùn)算符,要求%兩側(cè)均為整型數(shù)據(jù)。如7%3的值為1)

3.3.2 位運(yùn)算符

Verilog HDL作為一種硬件描述語言,是針對(duì)硬件電路而言的。在硬件電路中信號(hào)有四種狀態(tài)值1,0,x,z.在電路中信號(hào)進(jìn)行與或非時(shí),反映在Verilog HDL中則是相應(yīng)的操作數(shù)的位運(yùn)算。

3.3.2.1 "取反"運(yùn)算符~

~是一個(gè)單目運(yùn)算符,用來對(duì)一個(gè)操作數(shù)進(jìn)行按位取反運(yùn)算。

其運(yùn)算規(guī)則見下表:

ecdbc99c-a299-11ed-bfe3-dac502259ad0.jpg

圖3 取反求值

rega='b1010;//rega的初值為'b1010

rega=~rega;//rega的值進(jìn)行取反運(yùn)算后變?yōu)?b0101

3.3.2.2 “按位與”運(yùn)算符 &

按位與運(yùn)算就是將兩個(gè)操作數(shù)的相應(yīng)位進(jìn)行與運(yùn)算,

其運(yùn)算規(guī)則見下表:

eceadd38-a299-11ed-bfe3-dac502259ad0.jpg

圖4 按位與求值

3.3.2.3 “按位或”運(yùn)算符|

按位或運(yùn)算就是將兩個(gè)操作數(shù)的相應(yīng)位進(jìn)行或運(yùn)算。

其運(yùn)算規(guī)則見下表:

ecfdd168-a299-11ed-bfe3-dac502259ad0.jpg

圖5 按位或求值

3.3.2.4 “按位異或”運(yùn)算符^(也稱之為XOR運(yùn)算符)

按位異或運(yùn)算就是將兩個(gè)操作數(shù)的相應(yīng)位進(jìn)行異或運(yùn)算。

其運(yùn)算規(guī)則見下表:

ed0da282-a299-11ed-bfe3-dac502259ad0.jpg

圖6 按位異或求值

3.3.2.5 “按位同或”運(yùn)算符^~

按位同或運(yùn)算就是將兩個(gè)操作數(shù)的相應(yīng)位先進(jìn)行異或運(yùn)算再進(jìn)行非運(yùn)算。其運(yùn)算規(guī)則見下表:

ed222c48-a299-11ed-bfe3-dac502259ad0.jpg

圖7 按位同或求值

3.3.2.6 不同長(zhǎng)度的數(shù)據(jù)進(jìn)行位運(yùn)算

兩個(gè)長(zhǎng)度不同的數(shù)據(jù)進(jìn)行位運(yùn)算時(shí),系統(tǒng)會(huì)自動(dòng)的將兩者按右端對(duì)齊。位數(shù)少的操作數(shù)會(huì)在相應(yīng)的高位用0填滿,以使兩個(gè)操作數(shù)按位進(jìn)行操作。

3.4 邏輯運(yùn)算符

在Verilog HDL語言中存在三種邏輯運(yùn)算符:

1) && 邏輯與

2) || 邏輯或

3) ! 邏輯非

“&&”和“||”是二目運(yùn)算符,它要求有兩個(gè)操作數(shù),如(a>b)&&(b>c),(a單目運(yùn)算符,只要求一個(gè)操作數(shù),如!(a>b)。下表為邏輯運(yùn)算的真值表。它表示當(dāng)a和b的值為不同的組合時(shí),各種邏輯運(yùn)算所得到的值。

ed33de84-a299-11ed-bfe3-dac502259ad0.jpg

圖 8 求與

邏輯運(yùn)算符中“&&”和“||”的優(yōu)先級(jí)別低于關(guān)系運(yùn)算符,“!” 高于算術(shù)運(yùn)算符。

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

關(guān)系運(yùn)算符共有以下四種:

a < b a小于b

a > b a大于b

a <= b a小于或等于b

a >= b a大于或等于b

在進(jìn)行關(guān)系運(yùn)算時(shí),如果聲明的關(guān)系是假的(false),則返回值是0,如果聲明的關(guān)系是真的(true),則返回值是1,如果某個(gè)操作數(shù)的值不定,則關(guān)系是模糊的,返回值是不定值。

3.6 等式運(yùn)算符

在Verilog HDL語言中存在四種等式運(yùn)算符:

1) = = (等于)

2) != (不等于)

3) = = = (等于)

4) != = (不等于)

注意:求反號(hào)、雙等號(hào)、三個(gè)等號(hào)之間不能有空格

這四個(gè)運(yùn)算符都是二目運(yùn)算符,它要求有兩個(gè)操作數(shù)。"=="和"!="又稱為邏輯等式運(yùn)算符。其結(jié)果由兩個(gè)操作數(shù)的值決定。由于操作數(shù)中某些位可能是不定值x和高阻值z(mì),結(jié)果可能為不定值x。而“===”和“!==”運(yùn)算符則不同,它在對(duì)操作數(shù)進(jìn)行比較時(shí)對(duì)某些位的不定值x和高阻值z(mì)也進(jìn)行比較,兩個(gè)操作數(shù)必需完全一致,其結(jié)果才是1,否則為0。“===”和“!==”運(yùn)算符常用于case表達(dá)式的判別,所以又稱為“case等式運(yùn)算符”。這四個(gè)等式運(yùn)算符的優(yōu)先級(jí)別是相同的。下面畫出==與===的真值表,幫助理解兩者間的區(qū)別。

ed41226a-a299-11ed-bfe3-dac502259ad0.jpg

圖9 ===與==的區(qū)別

下面舉一個(gè)例子說明“==”和“===”的區(qū)別。

例:

if(A==1‘bx) $display(“AisX”);(當(dāng)A等于X時(shí),這個(gè)語句不執(zhí)行)

if(A===1‘bx) $display(“AisX”);(當(dāng)A等于X時(shí),這個(gè)語句執(zhí)行)

3.7 移位運(yùn)算符

在Verilog HDL中有兩種移位運(yùn)算符:

<< (左移位運(yùn)算符) 和 >>(右移位運(yùn)算符)。

其使用方法如下:

a >> n 或 a << n

a代表要進(jìn)行移位的操作數(shù),n代表要移幾位。這兩種移位運(yùn)算都用0來填補(bǔ)移出的空位。

3.8 位拼接運(yùn)算符(Concatation)

在Verilog HDL語言有一個(gè)特殊的運(yùn)算符:位拼接運(yùn)算符{}。用這個(gè)運(yùn)算符可以把兩個(gè)或多個(gè)信號(hào)的某些位拼接起來進(jìn)行運(yùn)算操作。其使用方法如下:

{信號(hào)1的某幾位,信號(hào)2的某幾位,..,..,信號(hào)n的某幾位}

即把某些信號(hào)的某些位詳細(xì)地列出來,中間用逗號(hào)分開,最后用大括號(hào)括起來表示一個(gè)整體信號(hào)。見下例:

{a,b[3:0], w, 3’b101}

也可以寫成為

{a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1}

在位拼接表達(dá)式中不允許存在沒有指明位數(shù)的信號(hào)。這是因?yàn)樵谟?jì)算拼接信號(hào)的位寬的大小時(shí)必需知道其中每個(gè)信號(hào)的位寬。

位拼接還可以用重復(fù)法來簡(jiǎn)化表達(dá)式。見下例:

{4{w}} //這等同于{w,w,w,w}

位拼接還可以用嵌套的方式來表達(dá)。見下例:

{b,{3{a,b}}} //這等同于{b,a,b,a,b,a,b}

用于表示重復(fù)的表達(dá)式如上例中的4和3,必須是常數(shù)表達(dá)式。

3.9 縮減運(yùn)算符(reduction operator)

縮減運(yùn)算符是單目運(yùn)算符,也有與或非運(yùn)算。其與或非運(yùn)算規(guī)則類似于位運(yùn)算符的與或非運(yùn)算規(guī)則,但其運(yùn)算過程不同。位運(yùn)算是對(duì)操作數(shù)的相應(yīng)位進(jìn)行與或非運(yùn)算,操作數(shù)是幾位數(shù)則運(yùn)算結(jié)果也是幾位數(shù)。而縮減運(yùn)算則不同,縮減運(yùn)算是對(duì)單個(gè)操作數(shù)進(jìn)行或與非遞推運(yùn)算,最后的運(yùn)算結(jié)果是一位的二進(jìn)制數(shù)??s減運(yùn)算的具體運(yùn)算過程是這樣的:第一步先將操作數(shù)的第一位與第二位進(jìn)行或與非運(yùn)算,第二步將運(yùn)算結(jié)果與第三位進(jìn)行或與非運(yùn)算,依次類推,直至最后一位。

例如:reg [3:0] B;

reg C;

C = &B;

相當(dāng)于:

C =( (B[0]&B[1]) & B[2] ) & B[3];

由于縮減運(yùn)算的與、或 運(yùn)算規(guī)則類似于位運(yùn)算符與、或 運(yùn)算規(guī)則,這里不再詳細(xì)講述,請(qǐng)參照位運(yùn)算符的運(yùn)算規(guī)則介紹。

3.10 優(yōu)先級(jí)別

下面對(duì)各種運(yùn)算符的優(yōu)先級(jí)別關(guān)系作一個(gè)總結(jié)。見下表:

ed53990e-a299-11ed-bfe3-dac502259ad0.jpg

圖10 運(yùn)算符優(yōu)先級(jí)

3.11 關(guān)鍵詞

在Verilog HDL中,所有的關(guān)鍵詞是事先定義好的確認(rèn)符,用來組織語言結(jié)構(gòu)。關(guān)鍵詞是用小寫字母定義的,因此在編寫程序代碼時(shí)必須注意關(guān)鍵詞的書寫,以避免出錯(cuò)。下面是Verilog HDL中使用的關(guān)鍵詞

always, and, assign, begin, buf, bufif0, bufif1, case, casex, casez, cmos, deassign, default, defparam, disable, edge, else, end, endcase, endmodule, endfunction, endprimitive, endspecify, endtable, endtask, event, for, force, forever, fork, function, highz0, highz1, if, initial, inout, input, integer, join,large, macromodule,medium, module, nand, negedge, nmos, nor, not, notif0, notifl, or, output, parameter, pmos, posedge, primitive, pull0, pull1, pullup, pulldown, rcmos, reg, releses, repeat, mmos, rpmos, rtran, rtranif0, rtranif1, scalared, small, specify, specparam, strength, strong0, strong1, supply0, supply1, table, task, time, tran, tranif0, tranif1, tri, tri0, tri1, triand, trior, trireg, vectored, wait, wand, weak0, weak1, while, wire, wor, xnor, xor

注意在編寫Verilog HDL程序時(shí),變量的定義不要與這些關(guān)鍵詞沖突。

3.12 賦值語句

3.12.1 賦值語句

在Verilog HDL語言中,信號(hào)有兩種賦值方式:

(1).非阻塞(Non_Blocking)賦值方式( 如 b <= a; )

A) 在語句塊中,上面語句所賦的變量值不能立即就為下面的語句所用;

B) 塊結(jié)束后才能完成這次賦值操作,而所賦的變量值是上一次賦值得到的;

C) 在編寫可綜合的時(shí)序邏輯模塊時(shí),這是最常用的賦值方法。

[注意]:非阻塞賦值符 “ <= ” 與小于等于符 “<= ” 看起來是一樣的,但意義完全不同,小于等于符是關(guān)系運(yùn)算符,用于比較大小。而非阻塞賦值符用于時(shí)序賦值操作。

(2).阻塞(Blocking)賦值方式( 如 b = a; )

A) 賦值語句執(zhí)行完后,塊才結(jié)束;

B) b的值在賦值語句執(zhí)行完后立刻就改變的

C) 在時(shí)序邏輯設(shè)計(jì)中使用,可能會(huì)產(chǎn)生意想不到的結(jié)果。

非阻塞賦值方式和阻塞賦值方式的區(qū)別常給設(shè)計(jì)人員帶來問題。問題主要是給"always"塊內(nèi)的reg型信號(hào)的賦值方式不易把握。"always"模塊內(nèi)的reg型信號(hào)都是采用下面的這種賦值方式:

b <= a;

這種方式的賦值并不是馬上執(zhí)行的,也就是說 "always" 塊內(nèi)的下一條語句執(zhí)行后,b并不等于a,而是保持原來的值。"always" 塊結(jié)束后,才進(jìn)行賦值。而另一種賦值方式阻塞賦值方式,如下所示:

b = a;

這種賦值方式是馬上執(zhí)行的。也就是說執(zhí)行下一條語句時(shí),b已等于a。盡管這種方式看起來很直觀,但是可能引起麻煩

總結(jié):

1) 在Verilog 模塊中所有過程塊(如:initial塊、always塊)、連續(xù)賦值語句、實(shí)例引用都是并行的;

2) 它們表示的是一種通過變量名互相連接的關(guān)系;

3) 在同一模塊中各個(gè)過程塊、各條連續(xù)賦值語句和各條實(shí)例引用語句這三者出現(xiàn)的先后次序沒有關(guān)系;

4) 只有連續(xù)賦值語句(即用關(guān)鍵詞assign引出的語句)和實(shí)例引用語句(即用已定義的模塊名引出的語句),可以獨(dú)立于過程塊而存在于模塊的功能定義部分;

5) 被實(shí)例引用的模塊其端口可以通過不同名的連線或寄存器類型變量連 接到別的模塊相應(yīng)的輸出輸入信號(hào)端;

6) 在“always”塊內(nèi)被賦值的每一個(gè)信號(hào)都必須定義成reg型;

7) 無論是邏輯運(yùn)算、邏輯比較還是邏輯等式等邏輯操作一般發(fā)生在條件判斷語句中,其輸出只有:1 或 0,也可以理解為成立(真)或不成立(假);

8) 位拼接運(yùn)算符{ },在C語言中沒有定義,但在Verilog中是很有用的語法。我們可以借助于拼接符用一個(gè)信號(hào)名來表示由多位信號(hào)組成的復(fù)雜信號(hào),其中每個(gè)功能信號(hào)可以有自己獨(dú)立的名字和位寬;

9) 縮減運(yùn)算符(reduction operator)也是C語言所沒有的,合理地使用縮減運(yùn)算符可以使程序簡(jiǎn)潔、明了;

10) 阻塞和非阻塞賦值也是C語言所沒有的。我們應(yīng)當(dāng)理解這是非常重要的概念,特別在編寫可綜合風(fēng)格的模塊中要加以注意。阻塞語句,如果沒有寫延遲時(shí)間看起來是在同一時(shí)刻運(yùn)行,但實(shí)際上是有先后的,即在前面的先運(yùn)行,然后再運(yùn)行下面的語句,阻塞語句的次序與邏輯行為有很大的關(guān)系。而非阻塞的就不同了,在begin end之間的所有非阻塞語句都在同一時(shí)刻被賦值,因此邏輯行為與非阻塞語句的次序就沒有關(guān)系。在硬件實(shí)現(xiàn)時(shí)這兩者有很大的不同;

11) begin end 塊語句與C語言中的大括號(hào)對(duì)(即{})類似,而fork join語句在C語言中沒有定義,但其語義并不難理解。在測(cè)試模塊中描述測(cè)試信號(hào)時(shí)常在initial和always過程塊中使用并行塊。這種描述方法,由于時(shí)間關(guān)系只與起點(diǎn)比較,有時(shí)這樣表達(dá)比較容易和清楚。

審核編輯 :李倩


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

    關(guān)注

    143

    文章

    3637

    瀏覽量

    123315
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2761

    瀏覽量

    48587
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7622

    瀏覽量

    139238
  • 編程語言
    +關(guān)注

    關(guān)注

    10

    文章

    1952

    瀏覽量

    35497

原文標(biāo)題:FPGA編程語言——verilog語法詳解

文章出處:【微信號(hào):ZYNQ,微信公眾號(hào):ZYNQ】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

    相關(guān)推薦

    Verilog_HDL的基本語法詳解(夏宇聞版)

    Verilog_HDL的基本語法詳解(夏宇聞版):Verilog HDL是一種用于數(shù)字邏輯電路設(shè)計(jì)的語言。用
    發(fā)表于 10-08 14:48 ?0次下載
    <b class='flag-5'>Verilog</b>_HDL的基本<b class='flag-5'>語法</b><b class='flag-5'>詳解</b>(夏宇聞版)

    _Verilog_HDL的基本語法

    Verilog_HDL語言的學(xué)習(xí),為FPGA編程打下堅(jiān)實(shí)的基礎(chǔ)
    發(fā)表于 05-19 16:40 ?12次下載

    FPGA視頻教程之Verilog語法基礎(chǔ)的詳細(xì)資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是FPGA視頻教程之Verilog語法基礎(chǔ)的詳細(xì)資料說明資料免費(fèi)下載
    發(fā)表于 03-01 11:35 ?18次下載
    <b class='flag-5'>FPGA</b>視頻教程之<b class='flag-5'>Verilog</b><b class='flag-5'>語法</b>基礎(chǔ)的詳細(xì)資料說明

    FPGA之硬件語法篇:Verilog關(guān)鍵問題解惑

    大家都知道軟件設(shè)計(jì)使用軟件編程語言,例如我們熟知的C、Java等等,而FPGA設(shè)計(jì)使用的是HDL語言,例如VHDL和Verilog HDL。
    的頭像 發(fā)表于 12-05 07:11 ?1864次閱讀
    <b class='flag-5'>FPGA</b>之硬件<b class='flag-5'>語法</b>篇:<b class='flag-5'>Verilog</b>關(guān)鍵問題解惑

    FPGA視頻教程:Verilog語法基礎(chǔ)

    Verilog與C語言還是存在許多差別。另外,作為一種與普通計(jì)算機(jī)編程語言不同的硬件描述語言,它還具有一些獨(dú)特的
    的頭像 發(fā)表于 12-11 07:02 ?1912次閱讀
    <b class='flag-5'>FPGA</b>視頻教程:<b class='flag-5'>Verilog</b><b class='flag-5'>語法</b>基礎(chǔ)

    fpga用什么編程語言_fpga的作用

    經(jīng)??吹讲簧偃嗽谡搲锇l(fā)問,FPGA是不是用C語言開發(fā)的?國(guó)外有些公司專注于開發(fā)解決編譯器這方面問題,目的讓其能夠達(dá)到用C語言替代VHDL語言的目的,也開發(fā)出了一些支持用c
    發(fā)表于 07-29 16:37 ?2.5w次閱讀

    Verilog編程語言

    知乎上刷到一個(gè)問題,問性能最強(qiáng)的編程語言是什么?看到高贊回答到是Verilog,然后在評(píng)論區(qū)就引發(fā)了一場(chǎng)Verilog到底算不算編程
    的頭像 發(fā)表于 08-23 14:30 ?6373次閱讀

    FPGA編程語言verilog語法1

    Verilog HDL是一種用于數(shù)字系統(tǒng)設(shè)計(jì)的語言。用Verilog HDL描述的電路設(shè)計(jì)就是該電路的Verilog HDL模型也稱為模塊。Veri
    的頭像 發(fā)表于 05-22 15:52 ?1014次閱讀
    <b class='flag-5'>FPGA</b><b class='flag-5'>編程</b><b class='flag-5'>語言</b>之<b class='flag-5'>verilog</b><b class='flag-5'>語法</b>1

    FPGA編程語言verilog語法2

    Verilog HDL是一種用于數(shù)字系統(tǒng)設(shè)計(jì)的語言。用Verilog HDL描述的電路設(shè)計(jì)就是該電路的Verilog HDL模型也稱為模塊。Veri
    的頭像 發(fā)表于 05-22 15:53 ?968次閱讀
    <b class='flag-5'>FPGA</b><b class='flag-5'>編程</b><b class='flag-5'>語言</b>之<b class='flag-5'>verilog</b><b class='flag-5'>語法</b>2

    fpga芯片用什么編程語言

    FPGA芯片主要使用的編程語言包括Verilog HDL和VHDL。這兩種語言都是硬件描述語言,
    的頭像 發(fā)表于 03-14 16:07 ?1813次閱讀

    fpga用的是什么編程語言 fpga用什么語言開發(fā)

    fpga用的是什么編程語言 FPGA(現(xiàn)場(chǎng)可編程邏輯門陣列)主要使用的編程
    的頭像 發(fā)表于 03-14 17:09 ?3954次閱讀

    fpga用什么語言編程

    FPGA(現(xiàn)場(chǎng)可編程門陣列)的編程主要使用硬件描述語言(HDL),其中最常用的是Verilog HDL和VHDL。
    的頭像 發(fā)表于 03-14 18:17 ?3112次閱讀

    fpga是用c語言還是verilog

    FPGA(現(xiàn)場(chǎng)可編程邏輯門陣列)開發(fā)主要使用的編程語言是硬件描述語言(HDL),其中Verilog
    的頭像 發(fā)表于 03-27 14:38 ?2566次閱讀

    FPGA編程語言的入門教程

    FPGA(現(xiàn)場(chǎng)可編程邏輯門陣列)的編程涉及特定的硬件描述語言(HDL),其中Verilog和VHDL是最常用的兩種。以下是一個(gè)
    的頭像 發(fā)表于 10-25 09:21 ?729次閱讀

    Verilog與VHDL的比較 Verilog HDL編程技巧

    Verilog 與 VHDL 比較 1. 語法和風(fēng)格 VerilogVerilog語法更接近于 C
    的頭像 發(fā)表于 12-17 09:44 ?1015次閱讀

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品