基于NiosⅡ軟核處理器的七段數碼管動(dòng)態(tài)顯示
SOPC(System On Programmable Chip)技術(shù)是美國Altera公司于2000年最早提出的,并同時(shí)推出了相應的開(kāi)發(fā)軟件Quartus II。SOPC是基于FPGA解決方案的SOC(System On Chip),構成SOPC的方案也有多種。第一種是基于FPGA嵌入IP硬核的SOPC系統,即在FPGA中事先植入嵌入式系統處理器,目前最常用的嵌入式處理器大多采用了含有ARM的32位知識產(chǎn)權處理器核的器件。第二種是基于FPGA嵌入IP軟核的SOPC系統,目前最有代表性的軟核處理器分別是Altera公司的Nios II核,以及Xilinx公司的MicroBlaze核。第三種是基于HardCopy技術(shù)的SOPC系統,HardCopy就是利用原有的FPGA開(kāi)發(fā)工具,將成功實(shí)現于FPGA器件上的SOPC系統通過(guò)特定的技術(shù)直接向ASIC轉化。
1 基于A(yíng)ltera公司NiosⅡ軟核處理器的SOPC系統
Altera公司Nios II軟核是目前使用最為廣泛的一種軟核處理器。值得一提的是,利用Matlab和Altera公司的DSP Builder,用戶(hù)可以為Nios II軟核處理器設計各類(lèi)DSP硬件加速器,并以指令的方式加入Nios II的指令集,從而可以構建自己的DSP處理器系統。
1.1 基于NiosⅡ軟核處理器的SOPC系統結構
如圖1所示的一個(gè)基本的基于NiosⅡ軟核的SOPC系統,除NiosⅡ核、定時(shí)器和片上存儲器以外,還需要在FPGA器件中添加一些接口元件。這些元件一方面通過(guò)片上的Avolon總線(xiàn)與NiosⅡ軟核相連,另外一方面又提供了外設與NiosⅡ軟核通信的接口界面。
Altera公司QuartusⅡ軟件中的SOPC Builder工具提供了許多常用的外設接口元件,如UART接口元件、PIO接口元件等,通過(guò)這些接口元件可以連接諸如RS232、LED、數碼管和按鍵等輸入輸出設備。在相對復雜的系統設計當中,還可以通過(guò)Avalon三態(tài)總線(xiàn)橋外接大容最的SRAM和FLASH,以提供更大的程序和數據存儲空間。從圖1中,還可以注意到,通過(guò)使用系統提供的用戶(hù)自定制外設接口元件的功能,用戶(hù)可以在系統中添加一個(gè)符合Avalon總線(xiàn)規范的外設接口元件,以連接用戶(hù)特定功能的外部設備。
1.2 自定制Avalon用戶(hù)外設接口元件簡(jiǎn)介
對于自定制的Avalon外設接口元件按照Avalon總線(xiàn)操作的不同可以分為兩類(lèi):Avalon Slave外設接口元件型的自定制的Avalon Slave外設接口元件框圖。從圖2中可以看到寄存器的定義是自定制外設接口元件很重要的一部分,必須根據設計的需要確定寄存器的個(gè)數和種類(lèi)。圖2中的Avalon Slave接口提供了自定制外設接口元件與NiosⅡ處理器之間數據交換的界面,其接口信號類(lèi)型也必須根據設計的需要合理地進(jìn)行選擇。常用的Avalon Slave接口信號類(lèi)型有:clk,chipselect,address,write,writedata,byteenable,reset等。圖2中的任務(wù)邏輯具體說(shuō)明了自定制外設接口的功能,并給出了與外設連接的接口信號。
自定制Avalon Slave外設接口元件的方法:可以利用SOPC Builder提供的元件編輯器在圖形用戶(hù)界面下將用硬件描述語(yǔ)言(Verilog或VHDL)描述的用戶(hù)邏輯封裝成一個(gè)SOPC Builder元件。相應的硬件描述語(yǔ)言文件給出了自定制外設接口元件的內部寄存器結構,使用到的Avalon Slave接口信號和自定制外設接口的邏輯功能。一旦定制成功后,用戶(hù)自定制的外設接口就可以象SOPCBuilder中其他元件一樣被調用。
2 基于NiosⅡ軟核處理器的七段數碼管動(dòng)態(tài)顯示設計
數字系統設計中,用數碼管顯示數據結果是常用的一種方法。利用Altera的SOPC Builder工具進(jìn)行Nios Ⅱ系統設計時(shí),并沒(méi)有提供專(zhuān)門(mén)的數碼管顯示接口元件,但可以使用PIO元件驅動(dòng)數碼管顯示,不足之處是占用器件引腳數目過(guò)多。本文當中以自定制Avalon Slave外設接口元件的方式,給出了一種基于NiosⅡ軟核的七段數碼管動(dòng)態(tài)顯示設計方案。該設計可以用來(lái)驅動(dòng)1~8個(gè)共陰極(或共陽(yáng)極)數碼管的顯示,可以根據需要選擇小數點(diǎn)顯示的位置,每個(gè)數碼管可以顯示0~F之間的十六進(jìn)制字符。
圖3為自定制的數碼管動(dòng)態(tài)顯示接口元件邏輯結構圖,其中定義了2個(gè)寄存器display_data_reg和controlreg。display_data_reg是個(gè)一個(gè)32位二進(jìn)制的數據寄存器,其數據每4位可以譯碼得到1個(gè)數碼管的七段顯示所需的字符碼,因此,display_data_reg同時(shí)最多可以給出8個(gè)數碼管所需要的顯示數據。control_reg是一個(gè)8位二進(jìn)制的控制寄存器,但只定義了0~2位和第4位的含義。0~2位的數據給出了小數點(diǎn)顯示的位置,數值范圍在“000”~“111”之間,對應著(zhù)8個(gè)數碼管最低位到最高位的小數點(diǎn)的位置。第4位是數碼管顯示的啟動(dòng)停止位,當該數據位為1時(shí),可使自定制接口元件所驅動(dòng)的數碼管正常顯示結果;當該數據位為0時(shí),停止顯示,所有被驅動(dòng)的數碼管熄滅。
參數n定義了循環(huán)加法計數器的模數,同時(shí)也決定了驅動(dòng)數碼管顯示的個(gè)數,其取值范圍在1~8之間。clkdisplay是循環(huán)加法計數器的時(shí)鐘輸入,他決定了計數器的計數頻率,同時(shí)也決定了數碼管顯示的動(dòng)態(tài)掃描頻率。參數pos用于決定驅動(dòng)數碼管的類(lèi)型,其值可設定為0或1。當其值為0時(shí),seg_out字符碼輸出高電平有效,bit_control數碼管位選控制輸出低電平有效,此時(shí)輸出結果用于驅動(dòng)共陰極數碼管顯示;當pos值為1時(shí),seg_out字符碼輸出低電平有效,bit_control數碼管位選控制輸出高電平有效,此時(shí)輸出結果用于驅動(dòng)共陽(yáng)極數碼管顯示。
seg_out為自定制元件的字符碼輸出,用于驅動(dòng)數碼管顯示(包括小數點(diǎn)位)。其中,最高一位seg_out[7]用于驅動(dòng)對應數碼管的小數點(diǎn)顯示,低7位seg_out[6..0]用于驅動(dòng)數碼管的七段寧符顯示。圖3中數碼管七段譯碼器根據循環(huán)加法計數器的當前狀態(tài)值,從display_data_reg寄存器中選擇4位二進(jìn)制數據進(jìn)行譯碼。例如,當前驅動(dòng)的數碼管的個(gè)數為5個(gè)(即n=5),循環(huán)加法計數器的當前狀態(tài)值用count表示,則count在0~4范圍內變化;若計數器的當前狀態(tài)值count為2,則選擇寄存器display_data_reg[11..8]的4位二進(jìn)制數據進(jìn)行譯碼,若計數器的當前狀態(tài)值count為3,則選擇寄存器display_data_reg[15..12]的4位二進(jìn)制數據進(jìn)行譯碼,即總是選擇寄存器display_data_reg[(count+1)×4-1..count×4]的4位二進(jìn)制數據進(jìn)行譯碼。寄存器control_reg的低3位指明了小數點(diǎn)顯示的位置,如control_reg[2..0]的值為“000”,則第0位數碼管的小數點(diǎn)點(diǎn)亮,若control_reg[2..0]的值為“010”,則第2位數碼管的小數點(diǎn)點(diǎn)亮。因為,循環(huán)計數器的狀態(tài)值count反應了數碼管動(dòng)態(tài)顯示過(guò)程中當前數碼管顯示的位皆,因此,數碼管小數點(diǎn)譯碼器只要比較control_reg[2..0]與count的值,若兩者相等,seg_out[7]輸山有效值(共陰極輸出為高電平,共陽(yáng)極輸出為低電平)即可驅動(dòng)對應數碼管的小數點(diǎn)點(diǎn)亮。
bit_control為自定制元件的位選控制輸出,其數據寬度為n位二進(jìn)制,與要驅動(dòng)的數碼管的個(gè)數是一致的。上面已經(jīng)提到,循環(huán)加法計數器的狀態(tài)值count反應了當前數碼管顯示的位置。因此,只要根據count的值,使得bit_control對應位輸出有效值即可。例如,n取值為5,pos取值為0(即驅動(dòng)共陰極數碼管),若計數器的當前狀態(tài)值count為2,則bit_control的輸出結果為“11011”,若count為4,則bit_control的輸出結果為“01111”。
自定制元件的設計采用的是VHDL語(yǔ)言,其實(shí)體描述如下面程序所示:
從上面的程序可以看到:n和pos定義成了類(lèi)屬變量,當完成接口元件的定制以后,類(lèi)屬變量在自定制元件的設置窗口中將以用戶(hù)參數的形式出現,如圖4所示,用戶(hù)可以設置其值。
實(shí)體描述當中除定義了自定制元件與外部設備的接口信號clk_display,seg7_out,bit_control信號以外,還定義了 Avalon Slave接口信號,NiosⅡ軟核通過(guò)這些信號訪(fǎng)問(wèn)自定制元件中定義的寄存器。前面介紹的兩個(gè)寄存器display_data_reg和control_reg是在程序的結構體說(shuō)明部分定義的,具體語(yǔ)句如下:
signal display_data_reg:std_logic_vector(31downto 0);
signal control_reg:std_logic_vector(7 downto 0);
結構體中還完成了所定義的兩個(gè)寄存器的數據寫(xiě)入操作。圖3中所示的模n循環(huán)加法計數器、七段譯碼器、小數點(diǎn)譯碼器和位譯碼器也在結構體中按上面所介紹的功能設計完成。
3 實(shí)驗結果
為了驗證用于驅動(dòng)七段數碼管動(dòng)態(tài)顯示的自定制元件功能,實(shí)驗中使用SOPC Builder建立了一個(gè)最簡(jiǎn)單的NiosⅡ系統。該NiosⅡ系統添加了3個(gè)元件,名稱(chēng)為cpu_0的NiosⅡ軟核處理器;名稱(chēng)為seg7的自定制元件,用于完成數碼管的顯示驅動(dòng);名稱(chēng)為onchip_RAM的片上隨機存儲器,存放調試時(shí)的程序代碼以及用作程序運行空間。生成的NiosⅡ系統的圖形符號如圖5所示,clk是系統工作時(shí)鐘輸入;reset_n是系統復位輸入,低電平有效;clk_display_to_the_seg7是數碼管掃描時(shí)鐘輸入,他決定了數碼管動(dòng)態(tài)顯示的掃描速度;bit_control_from_the_seg7是位選控制輸出,決定了動(dòng)態(tài)過(guò)程中哪一個(gè)數碼進(jìn)行顯示;seg7_out_from_the_seg7是數碼管顯示數據輸出,決定了數碼管顯示的內容。
新建頂層原理圖,調用該NiosⅡ系統,為其添加輸入輸出引腳,并定義引腳號,選擇目標器件型號為EP1C6Q240C8,編譯生成配置文件,并通過(guò)下載電纜下載到目標器件中。接下來(lái)利用NiosⅡIDE建立用戶(hù)程序。
實(shí)驗建立NiosⅡ系統時(shí),添加驅動(dòng)七段數碼管顯示的自定制元件seg7時(shí)的參數n和pos(如圖4所示)設置成了兩種測試情況,分別用來(lái)驗證其驅動(dòng)共陰極和共陽(yáng)極數碼管顯示的情況。第一種測試情況將n設置成7,pos設置成0,用來(lái)驅動(dòng)7個(gè)共陰極數碼管顯示。NiosⅡIDE建立的用戶(hù)測試程序如下:
程序編譯通過(guò)后,可以在硬件中調試運行程序。為了便于觀(guān)察測試結果,在ModelSim中運行仿真結果,得到仿真波形如圖6所示。仿真分析時(shí)系統工作時(shí)鐘(clk)設置為了50 MHz,數碼管動(dòng)態(tài)顯示掃描頻率(clk_display)設置為1 kHz。圖6(a)給出了寄存器內容的寫(xiě)入過(guò)程,3個(gè)write高電平期間完成了 3次寄存器的寫(xiě)入操作。第一次write高電平將0x00寫(xiě)入address為1的寄存器(即控制寄存器,該定義是在自定制元件的硬件描述語(yǔ)言設計中完成的);第二次write高電平將0xAF05163寫(xiě)入address為0的寄存器(即數據寄存器);第三次write高電平將0x13又寫(xiě)入address為1的控制寄存器。當控制寄存器的內容為0x00時(shí),數碼管是停止顯示的,因此,在共陰極顯示的情況下bit_control的輸出全為高電平,直到控制寄存器的內容寫(xiě)入0x13后,bit_control才有輸出為低電平的情況(如圖6所示)。圖6(b)給出了寫(xiě)入寄存器內容以后的工作情況,當數據寄存器寫(xiě)入0xAF05163、控制寄存器寫(xiě)入0x13后,bit_control將從1111110到0111111循環(huán)變化,同時(shí)將數碼管顯示所需要的字符碼從seg7_out輸出。如當bit_control為1111110時(shí),seg7_out輸出字符碼為0x4F,對應顯示“3”;當bit_control為1111101時(shí),seg7_out輸出字符碼為0x7D,對應顯示“6”。由于控制寄存器寫(xiě)入的內容為0x13,即第三位數據管的小數點(diǎn)會(huì )亮起,因此當bit_control為1110111時(shí),seg7_out輸出字符碼為0xED(即二進(jìn)制的“11101101”),數碼管對應顯示“5”,而最高一位的“1”會(huì )讓該數碼管的小數點(diǎn)點(diǎn)亮。
以上是第一種測試情況。第二種測試情況是將seg7的參數n設置成5,pos設置成1,用來(lái)驅動(dòng)5個(gè)共陽(yáng)極數碼管顯示。NiosⅡ IDE建立的用戶(hù)測試程序如下:
程序編譯通過(guò)后,同樣在Modelsim中運行仿真結果,得到仿真波形如罔7所示。仿真分析時(shí)系統工作時(shí)鐘(clk)設置為了50 MHz,數碼管動(dòng)態(tài)顯示掃描頻率(clkdisplay)設置為1 kHz。
與第一種共陰極顯示情況相比,第二種共陽(yáng)極顯示時(shí)的寄存器寫(xiě)入過(guò)程是大體一樣的。不同之處在于共陽(yáng)極顯示時(shí)的bit_control和seg7_out和輸出極性正好與共陰極顯示時(shí)的相反。
通過(guò)以上的實(shí)驗,驗證了自定制七段數碼管動(dòng)態(tài)顯示接口元件功能的正確性。
4 結 語(yǔ)
在用Altera公司的SOPC Builder工具完成NiosⅡ軟核SOPC系統設計時(shí),可以用SOPC Builder中提供的元件來(lái)構建整個(gè)系統。但對于有些外部設備,SOPC Builder并沒(méi)有提供對應的接口元件,此時(shí),就可以使用SOPC Build-er工具的自定制用戶(hù)元件功能來(lái)創(chuàng )建特定功能的接口元件。在本文中,針對數碼管的顯示,定制了一個(gè)七段數碼管動(dòng)態(tài)顯示接口元件,可以用來(lái)驅動(dòng)1~8個(gè)共陰極(或共陽(yáng)極)數碼管的顯示,可以根據需要選擇小數點(diǎn)顯示的位置,每個(gè)數碼管可以顯示0~F之間的十六進(jìn)制字符,并通過(guò)實(shí)驗驗證了其功能的正確性。
評論