目录
第一部分、新建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)都会放在这个文件夹里面,文件夹你可以扫码进群下载,或者关注我,直接下载,粉丝福利(哈哈)!!!