天天看點

Nios II軟核實作UART通信一、UART IP核的介紹二、Nios II軟核實作UART通信三、實際結果四、參考資料

文章目錄

  • 一、UART IP核的介紹
  • 二、Nios II軟核實作UART通信
    • (一)硬體部分設計
    • (二)軟體設計
    • (三)下載下傳硬體和軟體
  • 三、實際結果
  • 四、參考資料

文章使用的工具及闆子類型

工具:Quartus II 13.1

開發闆:Cyclone IV E EP4CE115F29C7

一、UART IP核的介紹

  1. 定義

    實作FPGA上的嵌入式系統與外部器件的RS-232序列槽通信

    嵌入式系統的組成結構

    Nios II軟核實作UART通信一、UART IP核的介紹二、Nios II軟核實作UART通信三、實際結果四、參考資料
  2. 寄存器的說明
    Nios II軟核實作UART通信一、UART IP核的介紹二、Nios II軟核實作UART通信三、實際結果四、參考資料

    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通信

(一)硬體部分設計

  1. 完成基本的硬體部分設計

    請先參考下面連結中的硬體部分設計,完成相應的硬體部分設計

    https://blog.csdn.net/qq_43279579/article/details/115933154

  2. 添加其他IP核

    添加UART

    在搜尋框上輸入uart,選擇UART(RS-232 Serial Port),點選Add

    Nios II軟核實作UART通信一、UART IP核的介紹二、Nios II軟核實作UART通信三、實際結果四、參考資料
    進行資料設定,也可保持預設設定
    Nios II軟核實作UART通信一、UART IP核的介紹二、Nios II軟核實作UART通信三、實際結果四、參考資料
    連接配接時鐘和複位,以及資料位,中斷的設定,Export設定
    Nios II軟核實作UART通信一、UART IP核的介紹二、Nios II軟核實作UART通信三、實際結果四、參考資料
  3. 系統配置設定位址

    選擇System->Assign Base Address

  4. 使用FPGA資源

    選擇Generate->Generate,保持預設設定,點選Generate,選擇Save

  5. 建立頂層檔案

    回到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
               
    儲存檔案,并編譯
  6. 晶片引腳設定

    菜單裡選擇 Assignments-device,點選 Device pin options

    進行 unused pin 設定,可能會收到外部信号的幹擾,将未用引腳設定為 As input tri-stated,特殊引腳設定,設定為正常引腳

  7. 編譯完成後,配置設定管腳
    Nios II軟核實作UART通信一、UART IP核的介紹二、Nios II軟核實作UART通信三、實際結果四、參考資料
    再次編譯

(二)軟體設計

  1. 基本軟體設計過程

    請參考下面連結中,軟體設計的過程,完成檔案的建立

    https://blog.csdn.net/qq_43279579/article/details/115933154

  2. 修改代碼檔案

    打開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;
    }
               
  3. 儲存編譯

    點選儲存,選擇hello_wold_bsp,右鍵後,選擇Nios II中的Generate BSP,編譯應用檔案,選擇hello_world右鍵後,點選Build Project

(三)下載下傳硬體和軟體

  1. 硬體的下載下傳

    檢查是否檢測到USB-Blaster,如果檢測到後,點選Start,開始下載下傳,否則,就檢檢視問題出現在那個地方。

  2. 軟體的下載下傳

    選擇應用工程,右鍵後,選擇Run As中的Nios II Hardware,如果沒有出現問題,就點選Apply->Run.

三、實際結果

由于暫時無法連接配接闆子上面的RS-232接口,結果無法展示。後續能夠連接配接接口後,再添加相應的結果。

四、參考資料

https://www.bilibili.com/video/BV1kh41127Qm?p=6