文章目錄
- 一、UART IP核的介紹
- 二、Nios II軟核實作UART通信
-
- (一)硬體部分設計
- (二)軟體設計
- (三)下載下傳硬體和軟體
- 三、實際結果
- 四、參考資料
文章使用的工具及闆子類型
工具:Quartus II 13.1
開發闆:Cyclone IV E EP4CE115F29C7
一、UART IP核的介紹
-
定義
實作FPGA上的嵌入式系統與外部器件的RS-232序列槽通信
嵌入式系統的組成結構
- 寄存器的說明
divisor寄存器的說明
divisor寄存器的值是用于産生波特率時鐘的,它是一種可選的硬體功能。如果沒有使能Baud Rate Can Be Changed By Software(波特率能被軟體改變),将不存在divisor寄存器。
計算公式:
b a u d r a t e = c l o c k f r e q u e n c y d i v i s o r + 1 {baud rate=\frac {clock frequency}{divisor+1}} baudrate=divisor+1clockfrequency
d i v i s o r = i n t ( c l o c k f r e q u e n c y b a u d r a t e + 0.5 ) {divisor=int(\frac {clock frequency}{baud rate}+0.5)} divisor=int(baudrateclockfrequency+0.5)
status寄存器的說明
狀态寄存器的各個位可以反應UART核的各個狀态,重點說明TRDY,RRDY
名稱 操作 描述 TRDY 讀 Transmit Ready,TRDY位提示txdata寄存器的目前狀态。當txdata寄存器位空時,可以接收新的字元且TRDY位為1,反之。Avalon-MM主要制器必須等TRDY位為1後,才能将新的資料寫入txdata寄存器中 RRDY 讀 Receive Character Ready,RRDY位提示rxdata寄存器的目前狀态。當rxdata寄存器為空時,RRDY為0,且還不是讀取rxdata寄存器的時刻。當新接收的值傳輸到rxdata寄存器時,RRDY位置為1,讀rxdata寄存器會将RRDY位置置為0。Avalon-MM主要制器必須等待RRDY為變為1後,才能夠讀取rxdata寄存器
二、Nios II軟核實作UART通信
(一)硬體部分設計
-
完成基本的硬體部分設計
請先參考下面連結中的硬體部分設計,完成相應的硬體部分設計
https://blog.csdn.net/qq_43279579/article/details/115933154
-
添加其他IP核
添加UART
在搜尋框上輸入uart,選擇UART(RS-232 Serial Port),點選Add
進行資料設定,也可保持預設設定 連接配接時鐘和複位,以及資料位,中斷的設定,Export設定 -
系統配置設定位址
選擇System->Assign Base Address
-
使用FPGA資源
選擇Generate->Generate,保持預設設定,點選Generate,選擇Save
-
建立頂層檔案
回到Quarters,選擇New->Verilog HDL File
頂層檔案内容
儲存檔案,并編譯module uart( input clk, input reset_n, //uart的接收和發送端 input rxd,//接收 output txd//發送 ); system_qsys u0 ( .clk_clk (clk), // clk.clk .reset_reset_n (reset_n), // reset.reset_n .uart_rxd (rxd), // uart.rxd .uart_txd (txd) // .txd ); endmodule
-
晶片引腳設定
菜單裡選擇 Assignments-device,點選 Device pin options
進行 unused pin 設定,可能會收到外部信号的幹擾,将未用引腳設定為 As input tri-stated,特殊引腳設定,設定為正常引腳
- 編譯完成後,配置設定管腳 再次編譯
(二)軟體設計
-
基本軟體設計過程
請參考下面連結中,軟體設計的過程,完成檔案的建立
https://blog.csdn.net/qq_43279579/article/details/115933154
-
修改代碼檔案
打開hello_world中的.c檔案
内容如下
#include <stdio.h> #include "unistd.h" #include "system.h" #include "alt_types.h" #include "altera_avalon_uart_regs.h" #include "sys\alt_irq.h" alt_u8 txdata=0; alt_u8 rxdata=0; //UART中斷服務函數 void IRQ_UART_Interrupts(){ rxdata = IORD_ALTERA_AVALON_UART_RXDATA(UART_BASE);//将rxdata寄存器中存儲的值讀入變量rxdata中 txdata = rxdata;//序列槽自收發,将變量rxdata的值賦給txdata while(!(IORD_ALTERA_AVALON_UART_STATUS(UART_BASE)& ALTERA_AVALON_UART_STATUS_TRDY_MSK)); //查詢發送準備接收信号,如果沒有準備好,則等待 IOWR_ALTERA_AVALON_UART_TXDATA(UART_BASE,txdata);//發送準備好,發送txdata } //中斷初始化函數 void IRQ_init() { //清除狀态寄存器 IOWR_ALTERA_AVALON_UART_STATUS(UART_BASE, 0); //使能接收準備中斷,給控制寄存器相應位寫1 IORD_ALTERA_AVALON_UART_CONTROL(UART_BASE); alt_ic_isr_register( UART_IRQ_INTERRUPT_CONTROLLER_ID,//注冊ISR UART_IRQ,//中斷控制器标号,從system.h複制 IRQ_UART_Interrupts,//UART中斷服務函數 0x0,//指向與裝置驅動執行個體相關的資料結構體 0x0);//flags,保留未用 } int main() { /*while(1){ IOWR_ALTERA_AVALON_UART_TXDATA(UART_BASE, "hello world!\n"); int i=0; while(i<5000) { i++; } }*/ IRQ_init(); while(1); return 0; }
-
儲存編譯
點選儲存,選擇hello_wold_bsp,右鍵後,選擇Nios II中的Generate BSP,編譯應用檔案,選擇hello_world右鍵後,點選Build Project
(三)下載下傳硬體和軟體
-
硬體的下載下傳
檢查是否檢測到USB-Blaster,如果檢測到後,點選Start,開始下載下傳,否則,就檢檢視問題出現在那個地方。
-
軟體的下載下傳
選擇應用工程,右鍵後,選擇Run As中的Nios II Hardware,如果沒有出現問題,就點選Apply->Run.
三、實際結果
由于暫時無法連接配接闆子上面的RS-232接口,結果無法展示。後續能夠連接配接接口後,再添加相應的結果。
四、參考資料
https://www.bilibili.com/video/BV1kh41127Qm?p=6