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