99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

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

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

從零開(kāi)始學(xué)FPGA-Verilog語(yǔ)法基礎(chǔ)(中)

電子工程師 ? 來(lái)源:FPGA設(shè)計(jì)論壇 ? 作者:FPGA設(shè)計(jì)論壇 ? 2021-03-14 10:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

我們接著上篇文章繼續(xù)學(xué)習(xí),上次提到了兩種賦值語(yǔ)句,讓我們接著往下學(xué)。

1、塊語(yǔ)句

塊語(yǔ)句包括兩種,一個(gè)是順序塊,一個(gè)是并行塊。

(1)順序快

順序快就好比C語(yǔ)言里的大括號(hào)“{ }”,在Verilog語(yǔ)法中,用begin…end代替。這里只需要知道,在begin…end中間的語(yǔ)句是順序執(zhí)行的就行了。

(2)并行塊

并行塊可以算是一個(gè)新的知識(shí)點(diǎn),與順序塊最大的不同就是并行塊中的語(yǔ)句是同時(shí)開(kāi)始執(zhí)行的,要想控制語(yǔ)句的先后順序,可以加延時(shí)語(yǔ)句控制。這種并行塊是用fork…join語(yǔ)句描述。

2、條件語(yǔ)句

條件語(yǔ)句這里不說(shuō),和C語(yǔ)言一樣。就說(shuō)一點(diǎn)主意事項(xiàng)。

在使用條件語(yǔ)句時(shí),要注意語(yǔ)句的嚴(yán)整與封閉性。和C語(yǔ)言不同,舉個(gè)例子

always @(al or d)

begin

if(al==1) q=d;

end

這個(gè)例子是說(shuō),當(dāng)al上升沿到來(lái)時(shí),d的值賦給q,那么當(dāng)al=0時(shí)又是什么情況呢,事實(shí)上,在always塊中,如果沒(méi)有給變量賦值,這個(gè)變量就會(huì)保持原值,也就是生成了一個(gè)鎖存器。為了避免這種情況的發(fā)生,我們一般這樣寫(xiě)

always @(al or d)

begin

if(al==1) q=d;

else q=0;

end

同樣在case語(yǔ)句中也要加上default語(yǔ)句避免鎖存器的生成,這樣可以使設(shè)計(jì)者更加明確的設(shè)計(jì)目標(biāo),也提高了程序的可讀性。

3、case語(yǔ)句

case語(yǔ)句要注意幾點(diǎn),只挑幾點(diǎn)重要的,其他的不說(shuō)了

(1)case語(yǔ)句分項(xiàng)后的表達(dá)式的值必須相同,否則就會(huì)出現(xiàn)問(wèn)題,例如上面圖片上的result。

(2)與C語(yǔ)言不同,與某一項(xiàng)case語(yǔ)句匹配后,就會(huì)跳出case語(yǔ)句,這里沒(méi)有break語(yǔ)句。

(3)case語(yǔ)句的所有表達(dá)式位寬必須相等,例如上圖都是16位整型,如果不加以說(shuō)明,系統(tǒng)會(huì)以默認(rèn)值32位控制表達(dá)式位寬。

下面是case,casez,case語(yǔ)句的真值表

bcba498a-8434-11eb-8b86-12bb97331649.jpg

這個(gè)表其實(shí)還是很好記的

case語(yǔ)句,只有匹配才出“1”

casez語(yǔ)句除了匹配出“1”之外,另外只要遇到“z”就出“1”

case語(yǔ)句除了匹配出“1”之外,另外只要遇到“z”或“x”就出“1”

上圖就用到了casez語(yǔ)句來(lái)處理不必要考慮的值,這樣就可以靈活的設(shè)置對(duì)信號(hào)的默寫(xiě)位進(jìn)行比較。

下面寫(xiě)了一個(gè)小例子來(lái)練習(xí)一下

使用case語(yǔ)句實(shí)現(xiàn)一個(gè)四選一多路選擇器

module xiaomo(a1,a2,a3,a4,out,s1,s2);

input a1,a2,a3,a4;

input s1,s2;

reg out; //把輸出變量聲明為寄存器類(lèi)型

always @(s1 or s2 or a1 or a2 or a3 or a4 or out) //任何信號(hào)的變化都會(huì)引起輸出變量的重新計(jì)算

begin

case ({s1,s2}) //位拼接運(yùn)算

2‘b00: out=a1;

2’b01: out=a2;

2‘b10: out=a3;

2’b11: out=a4;

default: out=1‘bx; //保持語(yǔ)句的嚴(yán)整性

endcase

end

endmodule

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

Verilog語(yǔ)法**有4中循環(huán)語(yǔ)句,這里只簡(jiǎn)單說(shuō)一下C語(yǔ)言里沒(méi)有的兩種

(1) forever語(yǔ)句

連續(xù)執(zhí)行語(yǔ)句,這種語(yǔ)句主要用在產(chǎn)生周期性的波形,用來(lái)做仿真信號(hào)。個(gè)人理解和always語(yǔ)句差不多的功能,但是,forever語(yǔ)句只能用在initial塊中。

(2)repeat 語(yǔ)句后面接常量表達(dá)式,可以指定循環(huán)次數(shù),例如;

repeat (8)

begin

end

表示循環(huán)8次相應(yīng)語(yǔ)句。

5、順序塊和并行塊

所謂順序塊就是前面說(shuō)的begin…end,他的作用就是把多條語(yǔ)句組合到一起執(zhí)行,在順序塊里面,語(yǔ)句是一條一條順序執(zhí)行的,如果遇到#10延遲語(yǔ)句,延遲也是相對(duì)于上一條語(yǔ)句的延遲,這一點(diǎn)比較重要。

相對(duì)于順序塊的就是并行塊,用fork…end語(yǔ)句表示,并行塊里的語(yǔ)句是同時(shí)執(zhí)行的。

順序塊和并行塊可以嵌套使用。

如果在begin或者fork語(yǔ)句后面加上名字,這個(gè)塊語(yǔ)句就成了命名塊,例如

begin :xiaomo

……

end

命名塊有什么好處呢?有了命名塊,我們就可以用verilog提供的disable語(yǔ)句來(lái)隨時(shí)終止命名塊,例如disable xiaomo;這樣,當(dāng)程序運(yùn)行到此時(shí),就會(huì)禁用命名塊,就會(huì)直接跳出塊語(yǔ)句,相當(dāng)于C語(yǔ)言里面的break語(yǔ)句一樣,看下面這個(gè)例子:

6、生成塊

生成塊語(yǔ)句可以動(dòng)態(tài)的生成Verilog代碼,這一聲明語(yǔ)句方面了參數(shù)化模塊的生成。黨對(duì)矢量中的多個(gè)位進(jìn)行重復(fù)操作時(shí),或者進(jìn)行多個(gè)模塊的實(shí)力引用時(shí),或者在根據(jù)參數(shù)的定義來(lái)確定程序中是否應(yīng)該包括末端Verilog代碼的時(shí)候,使用生成語(yǔ)句能夠大大簡(jiǎn)化程序的編寫(xiě)過(guò)程。

生成語(yǔ)句可以控制變量的聲明、任務(wù)或函數(shù)的調(diào)用,還能對(duì)實(shí)力引用進(jìn)行全面的控制。編寫(xiě)代碼時(shí)必須在模塊中說(shuō)明生成塊的實(shí)例范圍,關(guān)鍵字 generate…endgenerate用來(lái)指定該范圍。

Verilog中有三種生成語(yǔ)句的方法,分別是循環(huán)生成,條件生成和case生成。

(1)循環(huán)生成

注:genvar 是關(guān)鍵詞,用于生成生成變量,生成變量只存在于生成塊中,在確立后的方針代碼中,生成變量是不存在的。

xor_loop是賦予生成語(yǔ)句的名字,目的在于溝通它對(duì)循環(huán)生成語(yǔ)句之中的變量進(jìn)行層次化引用。因此循環(huán)生成語(yǔ)句中的各個(gè)異或門(mén)的相對(duì)層次為:xor_loop[0].gl,xor_loop[1].gl…,xor_loop[31] 這句話什么意思啊

這個(gè)例子中的 xor gl (out [ j ] , i0 [ j ], i1 [ j ] );什么意思??求大神指點(diǎn)

當(dāng)然這個(gè)異或門(mén)還可用always塊實(shí)現(xiàn)

生成塊程序

generate

for (j=0;j

begin :xiaomo

always @(i0[ j ] or i1[ j ]) out [ j ]=i0[ j ]^i1[ j ];

end

endgenerate

(2)條件生成

(3)case生成

下面是一個(gè)例子使用case語(yǔ)句生成N位的加法器

說(shuō)實(shí)話上面這些東西我自己也是看的模模糊糊,好多地方不懂,只能先截個(gè)圖放這兒了。唉。..基礎(chǔ)還是不行啊。..

7、結(jié)構(gòu)語(yǔ)句

(1)initial語(yǔ)句比較簡(jiǎn)單,這里就不多說(shuō)了。

(2)always語(yǔ)句

always語(yǔ)句在仿真過(guò)程中是不斷活動(dòng)的,always語(yǔ)句后面的語(yǔ)句是否執(zhí)行,這要看always語(yǔ)句是否滿足觸發(fā)條件。因此,always語(yǔ)句只有和時(shí)序控制語(yǔ)句結(jié)合才能使用,否則就會(huì)被死鎖。例如:always areg=~areg;

這個(gè)always語(yǔ)句生成一個(gè)0延遲的無(wú)限跳變過(guò)程這時(shí)會(huì)發(fā)生死鎖。但是一旦加上時(shí)序控制,這條語(yǔ)句就不一樣了,例如:

always #10 areg=~areg;

這樣的語(yǔ)句就描述的一個(gè)周期為20毫秒的跳變信號(hào)。所以我們常用這種方法來(lái)描述時(shí)鐘信號(hào),并作為激勵(lì)信號(hào)來(lái)測(cè)試硬件電路。

看下面這個(gè)例子

reg [7:0] counter;

reg tick;

always @(posedge areg)

begin

tick=~tick;

counter=counter+1;

end

這個(gè)例子就是說(shuō)每當(dāng)信號(hào)areg上升沿到來(lái)時(shí),信號(hào)tick取反,計(jì)數(shù)器counter加一,這種時(shí)間控制是always語(yǔ)句最常用的。

always語(yǔ)句的時(shí)間控制模板

如果組合邏輯塊語(yǔ)句的輸入變量過(guò)多容易漏掉,例如:

always @(a or b or c or d or e)

這樣的情況下可以用always@ (*)語(yǔ)句來(lái)代替,*號(hào)自動(dòng)將所有輸入變量默認(rèn)為敏感信號(hào)。

上面所討論的都是等待信號(hào)的值發(fā)生變化或者觸發(fā)時(shí)才執(zhí)行相應(yīng)語(yǔ)句,我們也可以用wait語(yǔ)句來(lái)用電平敏感來(lái)控制。例如

always

wait (count_enable) #20 count=count+1;

意思就是說(shuō),當(dāng)count-enable的值為1時(shí),程序延遲20毫秒后計(jì)數(shù)。

8、任務(wù)與函數(shù)

書(shū)上寫(xiě)了關(guān)于任務(wù)與函數(shù)的區(qū)別,寫(xiě)了好多,我覺(jué)得區(qū)別這兩個(gè)概念主要看一點(diǎn)就夠了,就是看有沒(méi)有返回值,函數(shù)有,任務(wù)沒(méi)有。舉個(gè)例子

switch_bytes (old_bytes,new_bytes);這是個(gè)任務(wù),沒(méi)有返回值,功能是把新舊兩個(gè)字節(jié)互換位置。

new_bytes=switch_bytes(old_bytes);這是個(gè)函數(shù),功能是把舊字節(jié)轉(zhuǎn)換后賦值給新字節(jié)。有返回值。

下面寫(xiě)一個(gè)交通信號(hào)燈的程序來(lái)學(xué)習(xí)一下任務(wù)這個(gè)概念

moudle xiaomo_traffic;

reg clock,red,green,amber;

//定義時(shí)鐘,紅燈,黃燈,綠燈

parameter on=1,off=0,red_tics=350.amber_tics=30,green_ics=200;

//定義紅燈等待350個(gè)時(shí)鐘,黃燈等待30個(gè)時(shí)鐘,綠燈等待200個(gè)時(shí)鐘

initial red=0;

initial green=0;

initial amber=0;

//初始化,這里用initial語(yǔ)句保證三條語(yǔ)句同時(shí)執(zhí)行

always

begin

red=on; //紅燈亮

light (red,red_tics); //這里用到任務(wù),功能是等待350個(gè)時(shí)鐘的時(shí)間,聲明看下面程序

amber=on; //黃燈亮

light (amber,amber_tics); //等待30個(gè)時(shí)鐘

green=on; //綠燈亮

light (green,green_tics); //等待200個(gè)時(shí)鐘

end

task:light; //命名任務(wù)

output color;

input [31:0] tics;

//注意這里的兩個(gè)變量要與上面的一一對(duì)應(yīng),也就是說(shuō)上面的light(red,red_tics);中的red對(duì)應(yīng)color,red_tics對(duì)應(yīng)tics

begin

repeat(tics); //重復(fù)執(zhí)行tics次下面的語(yǔ)句

@(posedge clock); //等待上升沿,因?yàn)檫@里的tics對(duì)應(yīng)上面的red_tics幾個(gè),所以這里要等待相應(yīng)個(gè)上升沿

color=off; //等到相應(yīng)個(gè)上升沿結(jié)束時(shí),相應(yīng)顏色的燈關(guān)閉

end

endtask

//下面就是寫(xiě)時(shí)鐘函數(shù)了,用always塊

always

begin

#100 clock=0;

#100 clock=1; //每100毫秒產(chǎn)生一次跳變

end

endmoudle

注意:這個(gè)程序要找對(duì)一一對(duì)應(yīng)關(guān)系,例如脈沖模塊里的clock對(duì)應(yīng)posedge clock中的clock,程序行與行之間是有聯(lián)系的,不能隨便聲明。

責(zé)任編輯:lq6

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

    關(guān)注

    31

    文章

    5434

    瀏覽量

    124513
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141773
  • 加法器
    +關(guān)注

    關(guān)注

    6

    文章

    183

    瀏覽量

    30769

原文標(biāo)題:零基礎(chǔ)學(xué)FPGA-Verilog語(yǔ)法中

文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    電商API集成入門(mén):從零開(kāi)始搭建高效接口

    ? 在當(dāng)今數(shù)字化電商時(shí)代,API(應(yīng)用程序接口)集成已成為企業(yè)提升效率、實(shí)現(xiàn)系統(tǒng)互聯(lián)的關(guān)鍵技術(shù)。無(wú)論是同步商品信息、處理訂單,還是整合支付系統(tǒng),一個(gè)高效的API接口能顯著優(yōu)化業(yè)務(wù)流程。本文將從零開(kāi)始
    的頭像 發(fā)表于 07-10 14:23 ?129次閱讀
    電商API集成入門(mén):<b class='flag-5'>從零開(kāi)始</b>搭建高效接口

    從零開(kāi)始學(xué)IP地址

    IP地址是一種網(wǎng)絡(luò)編碼,用來(lái)唯一標(biāo)識(shí)網(wǎng)絡(luò)的設(shè)備,以確保主機(jī)間正常通信。IP地址由32位二進(jìn)制(32-bit)組成。
    的頭像 發(fā)表于 07-08 09:29 ?235次閱讀
    <b class='flag-5'>從零開(kāi)始</b><b class='flag-5'>學(xué)</b>IP地址

    以太網(wǎng)入門(mén):從零開(kāi)始,掌握以太網(wǎng)基礎(chǔ)知識(shí)!

    以太網(wǎng)作為現(xiàn)代通信技術(shù)的基石,其重要性不言而喻。無(wú)論是日常網(wǎng)絡(luò)應(yīng)用,還是AI對(duì)高速大帶寬網(wǎng)絡(luò)的需求,以太網(wǎng)都扮演著不可或缺的角色。本文將從零開(kāi)始,帶您了解以太網(wǎng)的基礎(chǔ)知識(shí),幫助您快速入門(mén)。什么是以
    的頭像 發(fā)表于 06-09 14:00 ?2678次閱讀
    以太網(wǎng)入門(mén):<b class='flag-5'>從零開(kāi)始</b>,掌握以太網(wǎng)基礎(chǔ)知識(shí)!

    從零開(kāi)始之電機(jī)FOC控制

    我們將撕開(kāi)FOC神秘而虛偽的面紗,以說(shuō)人話的方式講述它。真正的做到從零開(kāi)始,小白一看就會(huì),一學(xué)就廢。如果覺(jué)得有用的話,就點(diǎn)個(gè)贊唄,純手碼。一、什么是FOC?FOC
    的頭像 發(fā)表于 04-23 19:34 ?1821次閱讀
    <b class='flag-5'>從零開(kāi)始</b>之電機(jī)FOC控制

    從零開(kāi)始學(xué)電源

    從零開(kāi)始學(xué)電源···內(nèi)部篇 從零開(kāi)始學(xué)電源---------內(nèi)部篇 (寫(xiě)這篇文的著眼點(diǎn)就在“從零開(kāi)始”上,所以涉及到一些詞匯和技術(shù)的時(shí)候,我
    發(fā)表于 04-07 15:30

    FPGA Verilog HDL語(yǔ)法之編譯預(yù)處理

    Verilog HDL語(yǔ)言和C語(yǔ)言一樣也提供了編譯預(yù)處理的功能?!熬幾g預(yù)處理”是Verilog HDL編譯系統(tǒng)的一個(gè)組成部分。Verilog HDL語(yǔ)言允許在程序中使用幾種特殊的命令(它們不是一般
    的頭像 發(fā)表于 03-27 13:30 ?625次閱讀
    <b class='flag-5'>FPGA</b> <b class='flag-5'>Verilog</b> HDL<b class='flag-5'>語(yǔ)法</b>之編譯預(yù)處理

    從零開(kāi)始學(xué)電路仿真Multisim與電路設(shè)計(jì)Protel技術(shù)——完整版

    資料介紹為讀者從零開(kāi)始,快速掌握EDA(電子設(shè)計(jì)自動(dòng)化)領(lǐng)域中最常用、最流行的兩個(gè)功能強(qiáng)大的應(yīng)用軟件Multisim、Protel而編寫(xiě)的。 本書(shū)首先介紹了EDA技術(shù)的發(fā)展與應(yīng)用,并對(duì)常用EDA軟件
    發(fā)表于 03-25 14:37

    Verilog 測(cè)試平臺(tái)設(shè)計(jì)方法 Verilog FPGA開(kāi)發(fā)指南

    Verilog測(cè)試平臺(tái)設(shè)計(jì)方法是Verilog FPGA開(kāi)發(fā)的重要環(huán)節(jié),它用于驗(yàn)證Verilog設(shè)計(jì)的正確性和性能。以下是一個(gè)詳細(xì)的
    的頭像 發(fā)表于 12-17 09:50 ?1146次閱讀

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

    Verilog 與 VHDL 比較 1. 語(yǔ)法和風(fēng)格 VerilogVerilog語(yǔ)法更接近于 C 語(yǔ)言,對(duì)于有 C 語(yǔ)言背景的工程
    的頭像 發(fā)表于 12-17 09:44 ?1705次閱讀

    從零開(kāi)始訓(xùn)練一個(gè)大語(yǔ)言模型需要投資多少錢(qián)?

    一,前言 ? 在AI領(lǐng)域,訓(xùn)練一個(gè)大型語(yǔ)言模型(LLM)是一個(gè)耗時(shí)且復(fù)雜的過(guò)程。幾乎每個(gè)做大型語(yǔ)言模型(LLM)訓(xùn)練的人都會(huì)被問(wèn)到:“從零開(kāi)始,訓(xùn)練大語(yǔ)言模型需要多久和花多少錢(qián)?”雖然網(wǎng)上有很多
    的頭像 發(fā)表于 11-08 14:15 ?791次閱讀
    <b class='flag-5'>從零開(kāi)始</b>訓(xùn)練一個(gè)大語(yǔ)言模型需要投資多少錢(qián)?

    Verilog硬件描述語(yǔ)言參考手冊(cè)

    一. 關(guān)于 IEEE 1364 標(biāo)準(zhǔn)二. Verilog簡(jiǎn)介三. 語(yǔ)法總結(jié)四. 編寫(xiě)Verilog HDL源代碼的標(biāo)準(zhǔn)五. 設(shè)計(jì)流程
    發(fā)表于 11-04 10:12 ?4次下載

    Verilog語(yǔ)法運(yùn)算符的用法

    verilog語(yǔ)法中使用以下兩個(gè)運(yùn)算符可以簡(jiǎn)化我們的位選擇代碼。
    的頭像 發(fā)表于 10-25 15:17 ?2569次閱讀
    <b class='flag-5'>Verilog</b><b class='flag-5'>語(yǔ)法</b><b class='flag-5'>中</b>運(yùn)算符的用法

    FPGA Verilog HDL有什么奇技巧?

    的話,仿真波形是z,雖然出結(jié)果時(shí)不影響,有沒(méi)有必要一開(kāi)始的時(shí)候直接reg賦初值?在rtl文件里能不能使用initial賦初值,這樣的rtl代碼能否綜合? A:在 Verilog ,是否有必要為所有
    發(fā)表于 09-12 19:10

    使用AD8001放大一個(gè)100mv左右的信號(hào),經(jīng)過(guò)放大的信號(hào)低電平都是三點(diǎn)幾伏,不能夠從零開(kāi)始,為什么?

    請(qǐng)問(wèn),如圖我想使用AD8001放大一個(gè)100mv左右的信號(hào),然后使用比較器輸出信號(hào)進(jìn)行計(jì)數(shù),但是現(xiàn)在經(jīng)過(guò)放大的信號(hào)低電平都是三點(diǎn)幾伏,不能夠從零開(kāi)始,請(qǐng)問(wèn)這是什么原因呢?如圖,紅色是需要放大的信號(hào),紫色是經(jīng)過(guò)放大的信號(hào)。
    發(fā)表于 08-20 06:17

    分享一本書(shū) 《從零開(kāi)始設(shè)計(jì) FPGA 最小系統(tǒng)》

    *附件:從零開(kāi)始設(shè)計(jì)FPGA最小系統(tǒng).pdf 以下為內(nèi)容片段摘要:詳細(xì)內(nèi)容在PDF里 FPGA 最小系統(tǒng)的概念 FPGA 最小系統(tǒng)是可以使 FPGA
    發(fā)表于 07-26 07:24