目录

第一部分、LED闪烁的储备知识

1、任务阐述

2、读写数据寄存器函数的用法

第二部分、新建Quartus II工程

第三部分、修改别人的软核

1、如何打开软核编辑界面

2、添加PIO核的详细步骤

第四部分、编写Quartus中的verilog代码

1、注意

2、verilog代码

第五部分、编写Ecplise里面的C代码

1、注意

2、c代码

第六部分、总结

1、结果演示

2、闲话

3、完整资料


第一部分、LED闪烁的储备知识

1、任务阐述

基于商家送的资料里面自带的NiosII例程修改,通过添加一个PIO的IP核实现FPGA上LED的闪烁。(绕口不,怪我语文没学好,只能描述成这个水平了,你可以留言说个通顺的,我到时候在Copy上来)。如果你的FPGA型号不一样,你就用你自己的。

2、读写数据寄存器函数的用法

IORD_ALTERA_AVALON_PIO_DATA(base);  //base:是你设置引脚对应的地址 
IOWR_ALTERA_AVALON_PIO_DATA(base, data);
//base:是你设置引脚对应的地址,在sysm.h文件中找。 
//data:是你想要写入的数据。

base的意思地址,这个地址是你在搭建你的软核时分配的(后面有这个步骤,这里看不懂没关系,先了解),然而这里第一个函数的意思就是:读PIO的数据,但是具体读哪一个PIO的数据,就需要你来确定了,而这个确定的方法就是你把那个PIO的地址写进来。第二个函数的意思就是:往PIO里面写数据,同理要你确定往哪个PIO里面写

但是我猜你会问,那这个地址在哪里呢?巧了,这个很简单,打开bsp文件夹下的system.h文件,在这个里面找。说实话我这里讲的很简单,讲的不算很清楚,我后面会教你怎么用,用几次就明白了。

 

第二部分、新建Quartus II工程

第一步、复制小梅哥的LCD9341的初始工程,到自己建立的文件夹中

注意:如果你和我FPGA型号不一样,那就复制你资料中的NiosII工程文件到文件夹中,因为其他的步骤大致都和我的一样,没有区别。如果你忘了这个怎么操作看第一篇。

第三部分、修改别人的软核

1、如何打开软核编辑界面

第一步、双击图中的方框

第二步、双击qysy文件

2、添加PIO核的详细步骤

第一步、添加软核需要的东西,这里不从头开始搭建,我们先学会在别人的工程上更改。

注意:我这还是以小梅哥的LCD驱动程序代码作为自己的基础,你FPGA型号如果和我不一样,那你选择一个你FPGA自带的资料中找一个类似SOPC工程,然后照着我下面的步骤一起操作

第二步、搜索PIO,双击添加PIO,然后进行相关的配置

第三步、配置LED对应的PIO,AC620一共有四个LED灯,所以Width应该是4位,Direction方向应该是output输出。初始的复位值可以设置位(0x。。。。0)让四个LED处于亮状态。(我的FPGA上LED3,2,1,0分别对应A3,A4,B3,A2 )

注意:你如果是别的FPGA,那你注意你FPGA上LED的个数。

第四步、进行连线,连线按照下面的错误提示来一步一步的连,基本上没有问题

第五步、自动分配地址,操作如图中

第六步、双击导出端口(看他的英文指导,你也知道怎么操作)

第七步、当你的操作步骤都是正确的时候,就会出现让人舒服的绿色信息,就像我字体的颜色一样

第八步、上述操作过后,接下来生成自己的软核,然后等待漫长的3-5分钟。

第九步、生成完成后,先别急着退出,如图打开这个窗口

第十步、将要导出的端口复制,这里你的名字可能和我的不一样,没关系,只要是你添加的PIO端口就可以,我这里是图中红色方框。

 

第四部分、编写Quartus中的verilog代码

1、注意

第一步、将你刚刚复制的代码复制到V文件中的u0中(目的是为了例化),然后定义你端口变量的名称和输出类型,

注意:我感觉我在这里没有说明白,因为你要一点点Verilog语法的基本知识,这里你才容易明白。如果没明白,你看一下我的代码的备注,就算你FPGA型号不同,你也可以看一下,很容易懂得。

2、verilog代码

第一步、如果你的单片机型号和我一样,那你爽了,将代码Copy过去,并进行预编译

module AC620_GHRD(
	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

	
	/*******************************************************************************************/
	/*需要添加的代码,我的FPGA是4个LED,所以这里是四位,类型是输出的*/
	output wire  [3:0] pio_led,/*这里名字,和下面括号中的要保持一致*/
   /*需要添加的代码,我的FPGA是4个LED,所以这里是四位,类型是输出的*/	
	/*******************************************************************************************/
	
	
	);

    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
		
		/*******************************************************************************************/
		/*这里是你刚刚复制的代码*/	
      /*这个是我导出的端口,复制到这里来*/	//这里我改了名字
		.pio_led_export 						  (pio_led)  //   pio_led.export
		/*******************************************************************************************/
	);

endmodule

第二步、预编译完成后分配引脚,(当然如果你不是这个型号的单片机也没关系,按照你那个单片机的引脚功能表填写),注意引脚被搞错了,(我的FPGA上LED3,2,1,0分别对应A3,A4,B3,A2 然后引脚电压是3.3VTTL),然后再进行全编译。

第五部分、编写Ecplise里面的C代码

1、注意

这里我省略如何新建Ecplise中的工程,不会的话看第一篇

2、c代码

第一步、新建新的工程,一般是Blank Project,这些都不难,主要出错误的就是代码。所以直接附上代码

#include <stdio.h>
#include <system.h>
#include "altera_avalon_pio_regs.h"//PIO读写头文件
#include "unistd.h"					//延时函数的头文件


int main()
{
  	while(1)
	{
  		IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE,0);//四个LED亮
		usleep(500000);  //500 000us = 500ms =0.5s
  		IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE,0x0f);//四个LED灭
		usleep(500000);//LED以一秒为周期闪烁
	}
}

 

第六部分、总结

1、结果演示

我已经拍成视频放在群文件中,你也可以先点击这个链接直接观看,看是否满足的你。。。(https://live.csdn.net/v/120093)。

2、闲话

这篇笔记所设计到的所有的资料我都会放到下面这个群的群文件中,欢迎老铁扫码进QQ群一起学习。博主也还是学生,我要是不会别骂我。当然还有第二种方法,关注我,就可以直接下载了!第三种办法、如果你不想加群,也不想关注我,你可以留下邮箱,我发资料的百度云链接给你。

“耗子尾汁”、“马老师,发生甚么事了”、“好好反思”、“我大意了,没有闪”、“不讲武德”、“来骗,来偷袭”!

3、完整资料

欢乐的白嫖时光从来不会缺席,向白嫖致敬!(完整工程、演示视频、参考资料下载链接:https://download.csdn.net/download/Learning1232/13196951

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐