首先介紹一下我所使用開發(fā)板的硬件資源,50MHZ時(shí)鐘輸入、4個(gè)低電平點(diǎn)亮的流水燈。然后通過兩種不同驅(qū)動(dòng)方式的對(duì)比使讀者更加深層次的了解層次化設(shè)計(jì)
FPGA的時(shí)鐘是50M,周期20ns,上述代碼每隔20ns,流水燈的狀態(tài)發(fā)生改變,即每個(gè)燈亮的狀態(tài)是20ns,時(shí)間非常短,人的肉眼觀察不到燈亮的狀態(tài)。
由于周期特別短導(dǎo)致無法觀察到燈亮,因此只要通過計(jì)數(shù)器將周期延長一定的時(shí)間,就可以看到“流水”現(xiàn)象。以下代碼通過設(shè)計(jì)一個(gè)計(jì)數(shù)器count將周期延長到兩秒,代碼如下
代碼經(jīng)過編譯以后得到RTL圖如下
下面提供相對(duì)應(yīng)的
仿真代碼,通過參數(shù)傳遞的方式將led_fsm1 中的NUM賦值為50,代替NUM=28'd100000000,提高仿真效率
具體解釋如下,在led_fsm1中NUM 達(dá)到28'd100000000-1(NUM-1)時(shí),才會(huì)產(chǎn)生時(shí)鐘的跳轉(zhuǎn),但是在波形仿真中仿真時(shí)間長,效率低,通過參數(shù)傳遞將50傳給NUM,這樣在仿真中,NUM-1=49時(shí),時(shí)鐘發(fā)生翻轉(zhuǎn),提高仿真效率,參數(shù)傳遞時(shí),將參數(shù)定義為parameter 類型,并且在文件中凡是能夠用到參數(shù)的地方,盡量要用參數(shù)表示,比如用到28'd100000000-1,可以用NUM-1代替,否則會(huì)導(dǎo)致參數(shù)傳遞失敗。具體參考給出的波形文件
仿真結(jié)果如下
從上面的波形看出當(dāng)count==50-1,led_out 發(fā)生改變,而不是count==28'd100000000-1 ,由此可知參數(shù)傳遞成功
那么,請(qǐng)問一下,在一個(gè)模塊里面既要寫count分頻模塊,又要寫led_out的輸出,有沒有簡單的思路呢?
下面我們介紹一種更簡單的思考方式,層次化設(shè)計(jì)
所謂層次設(shè)計(jì)就是將一個(gè)整體項(xiàng)目劃分成多個(gè)模塊,就像電腦由鍵盤、鼠標(biāo)、
顯示器構(gòu)成一樣。分好模塊以后,我們就必須要一個(gè)頂層文件,將多個(gè)模塊連接起來。
下面依然用一個(gè)50MHz的晶振點(diǎn)亮一個(gè)流水燈進(jìn)行層次化設(shè)計(jì)為例進(jìn)行講解。
首先考慮流水燈由哪幾個(gè)模塊構(gòu)成。如果用50MHz驅(qū)動(dòng)流水燈的話,50MHz頻率過快,會(huì)導(dǎo)致點(diǎn)亮流水燈的效果看不到,所以我們需要一個(gè)分頻模塊,將時(shí)鐘頻率降低。為了實(shí)現(xiàn)流水燈則需要一個(gè)邏輯控制模塊,最后將這兩個(gè)模塊在頂層中進(jìn)行連接
系統(tǒng)框圖如下:
接下來,設(shè)計(jì)具體
電路描述代碼,實(shí)現(xiàn)各模塊功能,首先,新建工程如下
然后建立起頂層文件
建立時(shí)鐘分頻模塊 led_freq 在這里不建議調(diào)用鎖相環(huán)(PLL),鎖相環(huán)分頻是有限制的,我試了一下如果用鎖相環(huán)來點(diǎn)燈的話,時(shí)鐘太快還是看不到流水的現(xiàn)象,所以需要獨(dú)立編寫一個(gè)led_freq模塊
在寫完分頻模塊以后,就要寫如何讓流水燈實(shí)現(xiàn),以下是流水燈控制模塊的代碼,在控制模塊(led_ctrl)中 注意信號(hào)clk, 此時(shí)鐘不是50M時(shí)鐘,是經(jīng)過分頻模塊分頻以后的時(shí)鐘,這點(diǎn)是如何實(shí)現(xiàn)的呢?可以看后面提供的RTL圖,看模塊的連接關(guān)系,和頂層模塊講解
下面先提供一個(gè)led_ctrl 控制的仿真代碼,用來測試單獨(dú)的流水燈控制模塊,具體代碼如下
led_ctrl模塊仿真波形如下
有以上波形可以看出,復(fù)位結(jié)束以后,流水燈的驅(qū)動(dòng)端口led_out和狀態(tài)機(jī)的狀態(tài)寄存器state在時(shí)鐘上升沿的驅(qū)動(dòng)下有效配合,實(shí)現(xiàn)了數(shù)據(jù)的滾動(dòng)賦值,可以正確實(shí)現(xiàn)流水燈設(shè)計(jì)。
下面編輯頂層模塊,頂層模塊的主要功能是將分頻模塊和流水燈控制模塊連接起來,我們要求在頂層中只做端口連線,不做任何邏輯。頂層具體代碼如下:
進(jìn)行全編譯,結(jié)果如下:
編譯通過,我們可以首先查看一下RTL級(jí)視圖,點(diǎn)擊Tools->Netlist Viewers->RTL Viewer
查看結(jié)果如下
由上圖可以說明,最終綜合出來的電路和我們所設(shè)想的是完全一致的。
通過對(duì)比以上兩種方法,可以很明顯的發(fā)現(xiàn)層次化設(shè)計(jì)的RTL視圖能夠清晰的反映出模塊之間的連接關(guān)系,在設(shè)計(jì)中可以獨(dú)立的對(duì)每個(gè)模塊進(jìn)行設(shè)計(jì),降低設(shè)計(jì)的復(fù)雜度,尤其是大規(guī)模的設(shè)計(jì),也便于代碼的調(diào)試,將一個(gè)復(fù)雜的系統(tǒng)轉(zhuǎn)換為對(duì)每個(gè)獨(dú)立模塊的調(diào)試,所以層次化設(shè)計(jì)是一項(xiàng)非常重要的設(shè)計(jì)技巧