日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[笔记][原创]Verilog HDL语法分析笔记

發(fā)布時(shí)間:2023/12/18 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [笔记][原创]Verilog HDL语法分析笔记 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

?????這篇帖子用于記錄學(xué)習(xí)Verilog過(guò)程中的一些syntax的問(wèn)題,會(huì)不斷更新,有不正確的地方請(qǐng)各位幫忙指正:D 一.Verilog 語(yǔ)法中的可綜合性 Verilog HDL 真的很強(qiáng)大,如果程序只用于仿真,那么幾乎所有的語(yǔ)法和編程語(yǔ)句都可以使用。但如果程序是用于硬件實(shí)現(xiàn),那么我們就必須保證程序的可綜合性,即所編寫的程序能被綜合器 轉(zhuǎn)化為相應(yīng)的電路結(jié)構(gòu)。不可綜合的HDL語(yǔ)句在用綜合工具綜合時(shí)將被忽略或者報(bào)錯(cuò)。作為設(shè)計(jì)者,應(yīng)該對(duì)可綜合模型的結(jié)構(gòu)有所了解。 雖然不同的綜合工具對(duì)Verilog HDL語(yǔ)法結(jié)構(gòu)的支持不盡相同,但Verilog HDL中某些典型的結(jié)構(gòu)是很明確地被所有綜合工具支持或不支持的。 (1)所有綜合工具都支持的結(jié)構(gòu): always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for, function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout, input,instantitation,module,negedge,posedge,operators,output,parameter。 (2)所有綜合工具都不支持的結(jié)構(gòu):time,defparam,$finish,fork,join,initial,delays,UDP,wait。 (3)有些工具支持有些工具不支持的結(jié)構(gòu):casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat, task,while。 看到一些資料上說(shuō)其實(shí)Verilog HDL的產(chǎn)生是為了寫testbench,而編程設(shè)計(jì)只用到了其中的很少的部分。Verilog有人說(shuō)很好學(xué),很容易入手,但是我覺(jué)得僅僅入手是沒(méi)有用的,充其量就雞肋一根,一定要仔細(xì)深入研究語(yǔ)法和結(jié)構(gòu),這樣才能寫出高效率的代碼,否則基本的代碼一塌糊涂的話后面的功能仿真,時(shí)序仿真都是浮云。 | | 二.避免鎖存器   在 always 塊的 if..else 語(yǔ)句中如果所列的條件不完整,綜合時(shí)則會(huì)產(chǎn)生鎖存器。 example: always @(action)
      ?   if(action)? out1 <= 1'b1;
        沒(méi)有考慮到 !action 的情況,默認(rèn)out1保持不變,這就產(chǎn)生了鎖存器。 優(yōu)化方法:1.列出 !action 的情況,2.對(duì)out1賦初始值 1.always @(action)
      ?   if(action)? out1 <= 1'b1; else??? out1 <= 1'b0; | 2.always @(action)? begin out <= 1'b0; if(action)? out1 <= 1'b1; end 但是,在描述時(shí)序邏輯的時(shí)候,也通常利用 if 語(yǔ)句的隱式條件對(duì)帶時(shí)鐘使能的 D 觸發(fā)器建模 example: always@(posedge clk, negedge rst_n)? begin if(!rst_n)? sum <= 0; else if(EN)? sum <= a+b; 表示在時(shí)鐘正沿來(lái)臨時(shí),如果 EN 為 1 ,則將 a+b 的值賦給 sum, 言下之意是如果 EN 為 0, 那么 sum 保持原值不變。這里綜合工具會(huì)把代碼綜合成一個(gè)帶時(shí)鐘使能的 D 觸發(fā)器。 三.產(chǎn)生占空比不等于50%的波形 (狀態(tài)機(jī)的巧用) 在面試的時(shí)候常常看到一些對(duì)verilog用得不熟的同學(xué),在被要求寫出可綜合的RTL代碼并產(chǎn)生占空比不同的輸出脈沖時(shí),選擇用很多計(jì)數(shù)器來(lái)對(duì)輸入的脈沖進(jìn)行計(jì)數(shù),而且還分別對(duì)輸入脈沖的上升沿和下降沿進(jìn)行計(jì)數(shù),非常的糟糕,因?yàn)檩斎氲拿}沖一般只能保證一個(gè)觸發(fā)沿是穩(wěn)定的 如果要產(chǎn)生占空比相同的波形,那么計(jì)數(shù)器可以很簡(jiǎn)單的搞定。 例如:將一個(gè)200kHz的時(shí)鐘做2分頻,4分頻,8分頻,這時(shí)候你也許會(huì)想到用PLL,但是這里的時(shí)鐘速率是kHz級(jí)別,很低,無(wú)法使用PLL。 可以這樣設(shè)計(jì):
    reg [2:0] cnt;
    always @(posedge clk_200k, negedge rst_n)
?    if(!rst_n)
??    cnt <= 3'b000;
?    else?
??    cnt <= cnt + 1'b1;
??
    assign clk_100k = cnt[0];
    assign clk_50k ?= cnt[1];
    assign clk_25k? = cnt[2]; 如要要求產(chǎn)生一個(gè)占空比為1:4的波形,用計(jì)數(shù)器實(shí)現(xiàn)的話就很麻煩了,在這種時(shí)候就可以用一個(gè)簡(jiǎn)單的狀態(tài)機(jī)來(lái)實(shí)現(xiàn)。 000->001->110->100->010-> |               | <----<----<----<----<----<- 利用狀態(tài)機(jī)就很簡(jiǎn)單的實(shí)現(xiàn)了占空比不同的波形的產(chǎn)生。 代碼如下: 1   reg [2:0] state;
2
3   always @(posedge clk, negedge rst_n)
4   if(!rst_n)
5    state <=3'b000;
6    else
7    case (state)
8    3'b000: state <= 3'b001;
9    3'b001: state <= 3'b110;
10    3'b110: state <= 3'b100;
11    3'b100: state <= 3'b010;
12    3'b010: state <= 3'b000;
13    default : state <=3'b000;
14    endcase
15
16   assign clk_out = state[0];
17

 ?? 仿真波形:

  

  狀態(tài)機(jī)的設(shè)計(jì)水平直接反映了工程師的邏輯功底,要寫好狀態(tài)機(jī)就一定要多練習(xí)。
?
                    

轉(zhuǎn)載于:https://www.cnblogs.com/semiok/archive/2010/10/13/1849730.html

總結(jié)

以上是生活随笔為你收集整理的[笔记][原创]Verilog HDL语法分析笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。