目錄
第一部分、新建Quartus II工程
1、注意
第二部分、修改別人軟核
1、添加UART核的詳細步驟
第三部分、撰寫Quartus中的verilog代碼
1、詳細步驟
2、verilog代碼:
第四部分、撰寫Ecplise里面的C代碼
1、注意
2、簡單的實作串口的接收和發送的代碼
第五部分、串口除錯助手的使用
1、串口除錯助手的引數配置
2、USB轉TTL和串口除錯助手的使用說明
第六部分、總結
1、我的BUG
2、效果演示
3、閑話
4、完整資料
第一部分、新建Quartus II工程
1、注意
如果你和我FPGA型號不一樣,那就復制你的SOPC工程檔案到檔案夾中,和前面一樣,因為其他的步驟大致都和我的一樣,沒有區別,
第一步、復制小梅哥的LCD9341的初始工程,到自己建立的檔案夾中

第二部分、修改別人軟核
1、添加UART核的詳細步驟
第一步、打開qsys檔案

第二步、添加一個UART(RS-232 Serial Port)IP核,里面的引數默認就可以

第三步、對添加的核進行連線,分配地址,匯出埠,連接中斷,

第四步、后面的步驟我在前面中講到了,忘記了的小伙伴可以回去看一下,(https://blog.csdn.net/Learning1232/article/details/111041890)
第三部分、撰寫Quartus中的verilog代碼
1、詳細步驟
第一步、生成系統,然后復制例化代碼,然后再頂層檔案里面添加例化的代碼,并且添加輸入例化輸出的串口代碼,

第二步、進行簡單的分析和綜合,也就是初步編譯,我認為是為了在分配管腳的界面出現新添加的埠,

第三步、進行引腳的分配,這里我是隨便選的我的FPGA上面兩個裸露的IO口,(選擇I/O口的要求我不知道,應該沒有要求,注意:如果你的FPGA型號和我不一樣,那你隨便選兩個你單片機上面的IO),然后進行全編譯,

2、verilog代碼:
module AC620_GHRD(
/*我新增的兩個變數*/
input wire uart_1_rxd, // uart_0.rxd
output wire uart_1_txd, // .txd
/*我新增的兩個變數*/
input wire clk, // clk.clk
input wire reset_n, // reset.reset_n
output wire lcd_rst, // lcd_rst.export
output wire lcd_rd_n, // lcd_rd.export
output wire lcd_bl, // lcd_bl.export
output wire lcd_wr_n, // lcd_wr.export
output wire lcd_rs, // lcd_rs.export
output wire lcd_cs_n, // lcd_cs.export
inout wire [15:0] lcd_data, // lcd_db.export
output wire sdram_clk, // sdram_clk.clk
output wire [11:0] sdram_addr, // sdram.addr
output wire [1:0] sdram_ba, // .ba
output wire sdram_cas_n, // .cas_n
output wire sdram_cke, // .cke
output wire sdram_cs_n, // .cs_n
inout wire [15:0] sdram_dq, // .dq
output wire [1:0] sdram_dqm, // .dqm
output wire sdram_ras_n, // .ras_n
output wire sdram_we_n, // .we_n
input wire uart_0_rxd, // uart_0.rxd
output wire uart_0_txd, // .txd
output wire epcs_dclk, // epcs.dclk
output wire epcs_sce, // .sce
output wire epcs_sdo, // .sdo
input wire epcs_data0 // .data0
);
mysystem u0 (
.clk_clk (clk), // clk.clk
.reset_reset_n (reset_n), // reset.reset_n
.uart_0_rxd (uart_0_rxd), // uart_0.rxd
.uart_0_txd (uart_0_txd), // .txd
.epcs_dclk (epcs_dclk), // epcs.dclk
.epcs_sce (epcs_sce), // .sce
.epcs_sdo (epcs_sdo), // .sdo
.epcs_data0 (epcs_data0), //
.lcd_rst_export (lcd_rst), // lcd_rst.export
.lcd_bl_export (lcd_bl), // lcd_bl.export
.lcd_wr_n (lcd_wr_n), // lcd.wr_n
.lcd_rd_n (lcd_rd_n), // .rd_n
.lcd_data (lcd_data), // .data
.lcd_rs (lcd_rs), // .rs
.lcd_cs_n (lcd_cs_n), //
.sdram_clk_clk (sdram_clk), // sdram_clk.clk
.altpll_0_phasedone_conduit_export (), // altpll_0_phasedone_conduit.export
.altpll_0_locked_conduit_export (), // altpll_0_locked_conduit.export
.altpll_0_areset_conduit_export (), // altpll_0_areset_conduit.export
.sdram_addr (sdram_addr), // sdram.addr
.sdram_ba (sdram_ba), // .ba
.sdram_cas_n (sdram_cas_n), // .cas_n
.sdram_cke (sdram_cke), // .cke
.sdram_cs_n (sdram_cs_n), // .cs_n
.sdram_dq (sdram_dq), // .dq
.sdram_dqm (sdram_dqm), // .dqm
.sdram_ras_n (sdram_ras_n), // .ras_n
.sdram_we_n (sdram_we_n), // .we_n
/*新添加的*/
.uart_1_rxd (uart_1_rxd), // uart_1.rxd
.uart_1_txd (uart_1_txd) // .txd
/*新添加的*/
);
endmodule
第四部分、撰寫Ecplise里面的C代碼
1、注意
這里省略了Ecplise軟體的使用說明,如果忘了的小伙伴,可以看我的《【NiosII學習】第一篇、如何燒錄NiosII工程:https://blog.csdn.net/Learning1232/article/details/110225728》,有巨詳細的步驟,
2、簡單的實作串口的接收和發送的代碼
#include <stdio.h>
#include <sys/unistd.h>
#include <io.h>
#include <string.h>
#include "system.h"
#include "altera_avalon_uart_regs.h"
#include "alt_types.h"
#include "sys/alt_irq.h"
alt_u16 i;
/*********************************************/
void UART_ISR_Init(void); //初始化串口
void UART_Irq_Handler(void);
/*********************************************/
int main(void)
{
int sec = 0;
printf("Hellow!\n");
UART_ISR_Init();
while(1)
{
printf("seconds = %d \n",sec);
printf("i = %d \n",i);
usleep(1000000);
sec++;
IOWR_ALTERA_AVALON_UART_TXDATA(UART_1_BASE,sec);
}
return 0;
}
/*********************************************/
/***********************************************/
void UART_Irq_Handler(void)
{
i++;
alt_u8 rx_dat;
//讀取接收資料
rx_dat = IORD_ALTERA_AVALON_UART_RXDATA(UART_1_BASE);
//發送接收資料
IOWR_ALTERA_AVALON_UART_TXDATA(UART_1_BASE, rx_dat);
//清除中斷標志暫存器
IOWR_ALTERA_AVALON_UART_STATUS(UART_1_BASE, 0x0);
}
void UART_ISR_Init(void)
{ //清除中斷標志暫存器
IOWR_ALTERA_AVALON_UART_STATUS(UART_1_BASE, 0x0);
//注冊中斷
alt_irq_register(UART_1_IRQ, NULL, UART_Irq_Handler);
//允許UART接收中斷
IOWR_ALTERA_AVALON_UART_CONTROL(UART_1_BASE, 0x0080);
}
第五部分、串口除錯助手的使用
1、串口除錯助手的引數配置

2、USB轉TTL和串口除錯助手的使用說明
這個我相信學過單片機的都知道這兩個怎么用,如果連這個你不知道怎么用,沒關系,別學了,放棄吧!
開個玩笑,你可以加群,然后私聊我,我看到了就會發教程給你,
第六部分、總結
1、我的BUG
考慮了很久還是決定把自己bug和大家分享一下,經過上面那些步驟,你現在肯定很枯燥,看我下面我的bug,是不是快樂很多了,
我當時給自己寫的:“我人傻了、搞了好幾天,遇到的一個讓人苦笑不得的笑話,以后要注意,while(1)前面的程式可以執行,但是里面的執行不了,那么想一下會不會是這個問題,”

2、效果演示
已經拍成視頻發放在檔案夾中,你也可以先點擊這個鏈接直接觀看(https://live.csdn.net/v/120132),這里放張圖片,

3、閑話
串口這個實驗一次性做成功有點難,我們班很多人都搞了好久,我幫別人的時候,發現他們有很多人是使用USB轉TTL時 ,將USB的rxd和FPGA定義的rxd接到一起了,所以,請注意:一定要讓RXD接TXD,
如果實在遇到問題,還是那句話你可以掃碼進群然后詢問我,說不定我也不會,我會我一定會教你,嘿嘿!

4、完整資料
我把這篇文章涉及到的所有的資料(完整工程、演示視頻、參考資料下載鏈接:https://download.csdn.net/download/Learning1232/13674877)都會放在這個檔案夾里面,檔案夾你可以掃碼進群下載,或者關注我,直接下載,粉絲福利(哈哈)!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/236113.html
標籤:其他
上一篇:計算及圖形學——實驗四
下一篇:和風天氣更新資料失敗原因分析
