基於Altera Quartus II的模塊化設計應用

個人檔案

基於Altera Quartus II的模塊化設計應用


 


       和ISE不一樣,Quartus II代碼的模塊化視圖並不是你把子模塊例化到頂層模塊以後就能馬上在工程代碼窗口看到一個清晰的層次圖。而是必須在你編譯後才能夠看到層次化的視圖。


 


       我在這裏列舉一個串口通信(實驗10)的實例:


       編寫完該HDL的代碼,還沒有編譯,此時在Project Navigator窗口中只有頂層模塊my_uart_top。




       頂層模塊如下(詳細的註釋代碼請參考相關實驗):


////////////////////////////////////////////////////////////////////////////////


module my_uart_top(


                            clk,rst_n,


                            rs232_rx,rs232_tx


                            );


input clk;


input rst_n;


input rs232_rx;


output rs232_tx; 


wire bps_start1,bps_start2;


wire clk_bps1,clk_bps2;


wire[7:0] rx_data;


wire rx_int;  


////////////////////////////////////////////


speed_select        speed_rx(    


                                                 .clk(clk),                                                                                                                       .rst_n(rst_n),


                                                 .bps_start(bps_start1),


                                                 .clk_bps(clk_bps1)


                                          );


 


my_uart_rx                 my_uart_rx(       


                                                 .clk(clk),                                                                                                                       .rst_n(rst_n),


                                                 .rs232_rx(rs232_rx),


                                                 .rx_data(rx_data),


                                                 .rx_int(rx_int),


                                                 .clk_bps(clk_bps1),


                                                 .bps_start(bps_start1)


                                          );


 


///////////////////////////////////////////                                        


speed_select        speed_tx(    


                                                 .clk(clk),


                                                 .rst_n(rst_n),


                                                 .bps_start(bps_start2),


                                                 .clk_bps(clk_bps2)


                                          );


 


my_uart_tx                 my_uart_tx(       


                                                 .clk(clk),


                                                 .rst_n(rst_n),


                                                 .rx_data(rx_data),


                                                 .rx_int(rx_int),


                                                 .rs232_tx(rs232_tx),


                                                 .clk_bps(clk_bps2),


                                                 .bps_start(bps_start2)


                                          );


Endmodule


 


       我們一般不在頂層模塊做任何邏輯設計,哪怕只是一個邏輯與操作。比較好的設計會明確的區分每一個模塊單元。在上面這個設計中,是要實現一個串口自收發通信的功能。具體說就是不斷的檢測串口接收信號rs232_rx是否有數據,如果接收到起始位就把數據保存,然後再轉手把接收到的數據通過串口發送信號rs232_tx發回給對方。即使是這樣一個還不算太複雜的功能,如果都堆到一個模塊裏,代碼不僅又臭又長,編寫代碼者如果不理好思路很容易自己就寫暈了,以後維護起來或者要移植就更難了。


所以,模塊化的設計勢在必行。上面的代碼把這個設計分成了四個模塊:


1、My_uart_tx:串口數據接收模塊;


2、Speed_tx:串口數據接收時鐘校準模塊;


3、My_uart_rx:串口數據發送模塊;


4、Speed_rx:串口數據發送時鐘校準模塊。


       如此劃分,層次清晰而且思路明確,寫起代碼來更是遊刃有餘。先來說模塊例化的一些細節吧。就拿speed_select模塊例化來看。第一行的speed_select            speed_rx,其中speed_select是要例化的模塊名,是固定的;而speed_rx則是你任意給這個模塊取的名字,它是用於區分例化多個相同的模塊。就如speed_tx和speed_rx兩個模塊,因爲它們的邏輯設計都是一樣的,所以寫一個模塊,然後在例化的時候給個不同的名稱就可以了。這有點類似軟件設計中的子程序調用,但又有不同,由於硬件設計的並行性,這裏的邏輯複製實際上在最後的硬件上是實現了兩個一模一樣的speed_select設計原型,可以說它們是完全獨立的。即便是對於硬件資源的消耗沒有減少,採用模塊化設計以後也能從很大程度上減少設計者的重複勞動。


       信號的例化是這樣的.clk(clk),點號後的clk代表例化模塊內部的信號(是固定的,必須和內部的信號名一致),而括號內的clk則是例化模塊的外部連接,可以例化模塊內的信號名不同。


       在編譯後,可以從Project Navigator窗口中看到例化的子模塊:




 


另外,從Quartus II提供的RTL視圖裏,我們能夠更深刻的感受到模塊化帶來的層次感:



點擊看大圖
轉自:http://bbs.ednchina.com/BLOG_ARTICLE_184341.HTM

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章