日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

Verilog有哪幾個(gè)版本?怎樣去寫出它?

FPGA之家 ? 來源:電子電路開發(fā)學(xué)習(xí) ? 作者:wcc149 ? 2021-06-15 16:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

眾所周知,用于FPGA開發(fā)的硬件描述語言(HDL)主要有兩種:Verilog和VHDL,VHDL的出現(xiàn)時(shí)間要比Verilog早,Verilog由于其簡(jiǎn)單的語法,和C語言的相似性,目前被各大公司廣泛使用。

其實(shí)我大學(xué)時(shí)學(xué)習(xí)的是VHDL語言,后來由于公司都是使用的Verilog,又重新學(xué)習(xí)了Verilog,好在有C語言基礎(chǔ),Verilog很快就上手了。

Verilog標(biāo)準(zhǔn)文檔主要有3個(gè)版本,分別是:

Verilog-1995

Verilog-2001

Verilog-2005

都是由IEEE頒布。目前最新的Verilog標(biāo)準(zhǔn)是2005版,相比于前兩個(gè)版本,2005更簡(jiǎn)潔,更靈活。

雖然一些官方的代碼,如Xilinx一些IP核代碼,為了兼容以前的綜合工具,還是基于Verilog-2001標(biāo)準(zhǔn),但我還是強(qiáng)烈建議你使用最新的Verilog-2005標(biāo)準(zhǔn)。

IEEE-2005

所以,本文都是基于IEEE-2005語法標(biāo)準(zhǔn),即《IEEE P1364-2005/D3:Draft Standard for Verilog HardwareDescription Language》官方標(biāo)準(zhǔn)文檔。

良好的代碼規(guī)范可以提高代碼的可讀性、可復(fù)用性、簡(jiǎn)潔清晰,這也是一種職業(yè)素質(zhì)的體現(xiàn)。

我們的目標(biāo)是:

WriteNowhere, ReadEverywhere

封面

都有哪些內(nèi)容?

命名

文件命名

端口命名

變量命名

參數(shù)命名

結(jié)構(gòu)

整體結(jié)構(gòu)

端口聲明

空格和縮進(jìn)讓代碼更清晰

小括號(hào)增加可讀性

例化

注釋

其他

IEEE-2005標(biāo)準(zhǔn)下載

命名

命名主要包括文件和模塊命名,端口命名,變量命名,參數(shù)命名等,概括來說就是:有意義,簡(jiǎn)短易讀,重要的是不要使用拼音!

文件命名

文件名和模塊名保持一致,一個(gè)文件只寫一個(gè)模塊。

文件命名 文件命名要有含義,且簡(jiǎn)短易讀,文件名統(tǒng)一使用小寫字母,并使用下劃線分割文件名。

底層驅(qū)動(dòng)類模塊命名,使用drv_xxx類型,如:drv_led.v,drv_i2c.v,drv_ad7606.v

串口發(fā)送一字節(jié):uart_tx_byte.v

異步和同步FIFO,并指示深度和寬度:fifo_async_512_16.v和fifo_sync_256_64.v

TestBench文件名問源文件名后加_tb,如源文件drv_led.v,則對(duì)應(yīng)的testbench文件命名為drv_led_tb.v

頂層模塊統(tǒng)一命名為top.v,或top_project_name.v,如EEPROM讀寫示例工程頂層命名為top_eeprom_demo.v

端口命名

端口命名和文件命名一樣,統(tǒng)一使用小寫字母,并使用下劃線進(jìn)行分割。

如果是頂層模塊,而且是連接到實(shí)際的FPGA管腳,后加_pad_i,_pad_o,_pad_io來命名,表示連接到實(shí)際的FPGA硬件管腳上。

頂層端口命名

變量命名

時(shí)鐘信號(hào)統(tǒng)一使用clk命名,如果是特定時(shí)鐘頻率,可以在后面添加時(shí)鐘頻率,如clk_50m

復(fù)位信號(hào)統(tǒng)一使用rst命名,如果是低電平有效,后加_n表示,如rst_n

標(biāo)志位命名:flag_rise/flag_fall/flag_clr

寄存器打拍信號(hào)命名添加_reg:reg rxd_reg

移位寄存器命名添加后綴_sreg:reg [3:0] busy_sreg

部分通用的縮寫:

縮寫 全拼 含義
rst reset 復(fù)位
clk cloc 時(shí)鐘
rd read 讀取
wr write 寫入
addr address 地址
ack acknowledge 響應(yīng)

參數(shù)命名

Verilog中的參數(shù)類似于C語言中的define,主要有以下兩類localparam和parameter,兩者的區(qū)別是前者不可以在例化時(shí)進(jìn)行參數(shù)傳遞,而后者可以在例化時(shí)進(jìn)行參數(shù)傳遞。

其他的變量,文件名都是統(tǒng)一小寫,只有參數(shù)定義有全部大寫的待遇,當(dāng)需要定義一些常量時(shí),可以通過參數(shù)聲明指定一個(gè)有意義的名稱。如:

parameterLED_ON=1'b0; parameterLED_OFF=!LED_ON; parameterBAUD_RATE=115200; parameterTIME_100MS=25_000_000;

狀態(tài)機(jī)的狀態(tài)通常使用localparam來定義,并指定有意義的名稱,統(tǒng)一使用Sn_NAME的格式,并指定位寬。如:

localparamS0_IDLE=4'd0; localparamS1_START=4'd1; localparamS2_DOING=4'd2; localparamS3_END=4'd3; localparamS_FINISH=4'd4; localparamS_ERROR='d5;//autoadaptive

結(jié)構(gòu)

整體結(jié)構(gòu)

建議Verilog模塊文件按照如下結(jié)構(gòu)進(jìn)行書寫。

/*1.文件頭:說明版權(quán)信息,文件功能,作者,版本歷史等*/ /*2.端口聲明:input/output/inout*/ /*3.宏定義:`define*/ /*4.參數(shù)定義:localparam/parameter*/ /*5.寄存器定義:reg*/ /*6.線網(wǎng)類型定義:wire*/ /*7.互聯(lián)定義:assign*/ /*8.時(shí)序邏輯描述:always*/

示例:

/*1.filehead*/ /*********************************************************** Copyright2021'wechat:mcu149'.Allrightsreserved. FileName:drv_led.v Function:leddriver Author:mcu149 SVN: SVNRevision:1490 SVNDate:2021-06-051949 Revision: 2020-09-09:Rev1.0 2020-10-01:Rev1.1 ************************************************************/ /*2.input/output/inout*/ moduledrv_led( //Inputs inputrst_n, inputclk_50m, inputen, //Outputs outputled1, outputregled2=0//defineinitialvalueis0 ); /*3.define*/ /*4.parameter/localparam*/ parameterTIME_500MS=32'd25_000_000; /*5.reg*/ reg[31:0]cnt=0; /*6.wire*/ wireflag_toggle=(cnt==TIME_500MS); /*7.assign*/ assignled1=(en==0)?0:cnt[20]; /*8.alwaysblock*/ always@(posedgeclk_50m)begin if(!rst_n) cnt<=?0; ????else?if(flag_toggle) ????????cnt?<=?0; ????else? ????????cnt?<=?cnt?+?1; end always?@?(posedge?clk_50m)?begin ????if(!rst_n) ????????led2?<=?0; ????else?if(!en)? ????????led2?<=?0; ????else?if(en)?begin ????????if(flag_toggle) ????????????led2?<=?!led2; ????end end endmodule

端口聲明

輸入端口放在一起,輸出端口放在一起,雙向端口放在一起。如果某個(gè)輸出信號(hào)需要確定初始值,可以在端口定義時(shí)直接進(jìn)行指定,這也是Verilog-2005新添加的功能。

端口命名

這一點(diǎn)有些朋友可能是按照功能進(jìn)行劃分,如連接同一芯片的放在一起。

輸入輸出分開放的好處是,在例化時(shí)可以很方便的區(qū)分哪些是輸入哪些是輸出。

空格和縮進(jìn)讓代碼更清晰

運(yùn)算符兩端增加一個(gè)空格,可以讓程序結(jié)構(gòu)更清晰,可讀性更高

縮進(jìn)風(fēng)格采用KR風(fēng)格,即begin寫在行尾,不占用單獨(dú)一行,end單獨(dú)占用一行

縮進(jìn)統(tǒng)一使用4個(gè)空格來代替TAB鍵

if/else等語句只有一行時(shí),可以省略begin-end

合理添加空行進(jìn)行塊區(qū)分,不同的always塊進(jìn)行換行隔開

以下是兩種代碼的書寫規(guī)范,合理縮進(jìn),合理增加空格大大增加了可讀性。

合理縮進(jìn)

小括號(hào)增加可讀性

在學(xué)校里有些考試題,為了考察學(xué)生對(duì)各種運(yùn)算符優(yōu)先級(jí)的掌握程度,出一些反人類的題目。

而做實(shí)際項(xiàng)目不像考試,追求的是可讀性和易用性,所以當(dāng)使用多個(gè)運(yùn)算符時(shí),為了增強(qiáng)可讀性,避免歧義,不要吝嗇使用小括號(hào)來表示運(yùn)算的優(yōu)先級(jí)。

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

例化

例化可以認(rèn)為是FPGA開發(fā)的靈魂所在了,例化的過程其實(shí)就是硬件模塊的調(diào)用過程,比如我們用Verilog描述了一個(gè)3-8譯碼器的模塊,可以在不同的地方去使用(例化)它,并分別命名為ut0/ut1/ut2等等,而且還可以在例化時(shí)指定參數(shù),如串口發(fā)送和接收模塊,通過指定不同的參數(shù)來實(shí)現(xiàn)不同波特率的兼容。

例化和端口聲明順序保持一致,輸入端口放在一起,輸出端口放在一起

多比特信號(hào),在例化時(shí)需要指定位寬,以增加可讀性

頂層模塊只進(jìn)行模塊例化,不寫任何控制語句

示例:

wire[7:0]rx_data; wirerx_done; wirerx_err; /*串口接收1字節(jié)*/ uart_rx_byte#( .BAUD_RATE(32'd115200), .EN_PARITY(2'd0),//0:無校驗(yàn)位,1:奇校驗(yàn),2:偶校驗(yàn) .EN_STOP_2(1'b0)//1:使能2位停止位 )uart_rx_byte_0( //Inputs .clk(clk_32m), .rst_n(rst_n), .rxd(uart_rxd), //Outputs .data_rx(rx_data[7:0]),//指定位寬 .done(rx_done), .err(rx_err) );

注釋

不要相信什么代碼就是最好的注釋!我不否認(rèn)有些人的代碼寫的就是很規(guī)范,命名合理,格式清晰。

但是我覺得你還沒有達(dá)到那種程度,不能保證每一個(gè)人都能讀懂沒有注釋的代碼。注釋不僅是為了給別人看,更多的也是為了給自己看,好記性不如爛筆頭。

注釋統(tǒng)一使用/**/注釋的方式,或者使用與//混合使用,看個(gè)人習(xí)慣!

每個(gè)變量定義后需要注釋變量的功能

每個(gè)always塊功能需要注釋

狀態(tài)機(jī)狀態(tài)含義需要注釋

條件語句的后面需要添加注釋

代碼修改,注釋也要隨之修改

其他

合理使用generate for可以批量化定義和例化模塊,減少代碼量,提高可讀性

testbench中使用task和function可以提高效率

移位操作替換為拼接補(bǔ)0操作,更易讀

時(shí)序邏輯統(tǒng)一使用非阻塞賦值,即<=符號(hào)

一行字符不要超過80個(gè),過長(zhǎng)通過換行來處理

先有頂層設(shè)計(jì),然后劃分子模塊功能,或者自底向上方法

模塊化設(shè)計(jì),提高模塊可復(fù)用程度

能用case的盡量不要用if/else

reg類型變量,根據(jù)需要看是否鎖存。

責(zé)任編輯:lq6

聲明:本文內(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)投訴
  • Verilog
    +關(guān)注

    關(guān)注

    31

    文章

    1374

    瀏覽量

    114737
  • vhdl
    +關(guān)注

    關(guān)注

    30

    文章

    822

    瀏覽量

    131902

原文標(biāo)題:如何寫出易于維護(hù)的Verilog代碼?

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    選擇磁軸鍵盤的線性霍爾,究竟該看哪幾個(gè)核心參數(shù)?

    作為將磁場(chǎng)變化轉(zhuǎn)換為電壓信號(hào)的器件,線性霍爾的上電時(shí)間、響應(yīng)速度、輸出底噪三項(xiàng)指標(biāo),直接影響鍵盤的啟動(dòng)延遲、觸發(fā)實(shí)時(shí)性與信號(hào)穩(wěn)定性。本文以MH4803為例,在相同測(cè)試條件下將其與同類產(chǎn)品進(jìn)行參數(shù)對(duì)比,聚焦磁軸鍵盤應(yīng)用中的關(guān)鍵指標(biāo),為技術(shù)選型提供客觀參考。
    的頭像 發(fā)表于 03-26 09:47 ?2416次閱讀
    選擇磁軸鍵盤的線性霍爾,究竟該看<b class='flag-5'>哪幾個(gè)</b>核心參數(shù)?

    Debian 69未檢測(cè)到Intenso NVME,怎樣才能讓工作?

    嘿。我剛剛設(shè)法更新到 2.5.0 并啟動(dòng)了 Debian 版本 69。 但未檢測(cè)到我的新 NVME SSD它在閃爍,但也許我必須做其他事情然后將其內(nèi)置? 我怎樣才能讓工作? 謝謝
    發(fā)表于 03-25 06:38

    變頻器的失速防止功能有哪幾個(gè)方面

    變頻器的失速防止功能(又稱防失速功能)是為了防止電機(jī)因加速過快、負(fù)載突變或再生能量過高等原因,導(dǎo)致變頻器跳過流、過壓或過載保護(hù)而停機(jī)。其核心目的是在保證設(shè)備連續(xù)運(yùn)行的前提下,自動(dòng)調(diào)節(jié)輸出頻率或電流,使電機(jī)維持在臨界穩(wěn)定狀態(tài)。
    的頭像 發(fā)表于 03-14 12:03 ?810次閱讀
    變頻器的失速防止功能有<b class='flag-5'>哪幾個(gè)</b>方面

    電機(jī)容易忽視的哪幾個(gè)問題?

    在工業(yè)生產(chǎn)和日常生活中,電機(jī)作為核心動(dòng)力設(shè)備廣泛應(yīng)用于各類機(jī)械系統(tǒng)中。然而,許多用戶在使用過程中往往忽視了一些關(guān)鍵問題,導(dǎo)致電機(jī)壽命縮短、效率下降甚至引發(fā)安全隱患。
    的頭像 發(fā)表于 03-13 16:56 ?627次閱讀

    怎樣開始啟用獨(dú)立看門狗呢?

    看門狗的原理是什么呢? 怎樣開始啟用獨(dú)立看門狗呢?
    發(fā)表于 01-08 06:33

    你覺得哪個(gè)軟件寫verilog體驗(yàn)最好?什么優(yōu)勢(shì)?

    你覺得哪個(gè)軟件寫verilog體驗(yàn)最好?什么優(yōu)勢(shì)?請(qǐng)?jiān)谠u(píng)論區(qū)留言跟大家分享一下吧。
    發(fā)表于 11-10 07:47

    使用NucleiStudio生成tb仿真需要的.verilog文件

    打開仿真頂層文件tb_top.v,存放在ITCM模塊里面的指令是通過readmemh函數(shù)讀入.verilog文件實(shí)現(xiàn)的: 下面通過對(duì)NucleiStudio IDE進(jìn)行設(shè)置,實(shí)現(xiàn)將c
    發(fā)表于 11-05 07:07

    熱敏電阻中哪幾個(gè)參數(shù)是比較重要的

    熱敏電阻中哪幾個(gè)參數(shù)是比較重要的 熱敏電阻全解析:NTC與PTC的特性、參數(shù)與選型指南 熱敏電阻是一種電阻值隨溫度發(fā)生顯著變化的半導(dǎo)體器件,主要分為負(fù)溫度系數(shù)(NTC) 和正溫度系數(shù)(PTC
    發(fā)表于 11-04 13:29

    使用rt-thread studio ,配置某對(duì)GPIO為串口,比如配置PA0與PA1 為uart1 ;如何操作?

    ,燒錄沒有問題,但是,我不知這個(gè)串口,比如是uart1. 是由哪幾個(gè)GPIO所配置而成?特請(qǐng)教一下,文檔看看也可以,感謝
    發(fā)表于 09-11 07:50

    #紅外傳感器哪幾種?怎么用?怎樣才能選對(duì)?

    傳感器
    iczoom
    發(fā)布于 :2025年09月02日 10:52:41

    請(qǐng)問如何使用ICP編程工具寫出序列號(hào)?

    如何使用ICP編程工具寫出序列號(hào)?
    發(fā)表于 08-19 07:01

    在Psoc4100S Datasheet中關(guān)于flash操作幾個(gè)問題求解

    你好! 在Psoc4100S Datasheet 中 關(guān)于flash操作幾個(gè)問題:1. Tbulkerase時(shí)間是全片擦除的時(shí)間么?2.Tdevprog 的7秒,是如何計(jì)算的? 3. 64KB產(chǎn)品,最快的燒寫速度是否有限制?手冊(cè)上只
    發(fā)表于 07-29 12:22

    TC397哪幾個(gè)Nodes支持TT-CAN呢?

    TC397 具有3個(gè)modules,每個(gè)modules具有4個(gè)Nodes,共支持12路CAN。哪幾個(gè)Nodes支持TT-CAN呢?支持TT-CAN的Nodes能否用做普通的CAN呢?
    發(fā)表于 07-29 10:38

    對(duì) XMC4xxx 控制器的 svd 文件(外圍接口庫)幾個(gè)問題求解

    我對(duì) XMC4xxx 控制器的 svd 文件(外圍接口庫)幾個(gè)問題: 1. 英飛凌的 *.svd 文件的官方來源是什么? 2. 那么:最新/當(dāng)前的 xmc4700.svd 文件版本是什么? 提問
    發(fā)表于 07-21 06:37

    【高云GW5AT-LV60 開發(fā)套件試用體驗(yàn)】基于開發(fā)板進(jìn)行深度學(xué)習(xí)實(shí)踐,并盡量實(shí)現(xiàn)皮膚病理圖片的識(shí)別,第二階段

    的算法一個(gè)一個(gè)的verilog實(shí)現(xiàn),我還是有點(diǎn)吃力的?因?yàn)槲?b class='flag-5'>有幾個(gè)問題還沒有弄清楚? 1、圖像的采集,保存,以及相關(guān)處理,以便符合后續(xù)model的需要? 當(dāng)然談到model,這里
    發(fā)表于 06-23 18:37
    兴和县| 清镇市| 柘荣县| 南华县| 武穴市| 湘乡市| 吉水县| 扶沟县| 兰西县| 侯马市| 安康市| 铜陵市| 沙洋县| 大冶市| 孟村| 广南县| 南和县| 博爱县| 鄂托克前旗| 定兴县| 蒙山县| 城口县| 丹阳市| 新津县| 汉源县| 晋中市| 福建省| 宁夏| 永胜县| 汶上县| 黑河市| 五指山市| 新郑市| 东台市| 沁水县| 温宿县| 山西省| 陕西省| 吉木乃县| 廊坊市| 彩票|