这篇笔记是我之前在调试MicroBlaze时记录下来的,当时在网上查了一些资料,发现都讲的不是特别清楚,所以自己整理了一个笔记,如有差错,希望大家指正。

在这次示例中,本文完成了一个改变流水灯的间隔时间以及按键检测的间隔时间可变的一个MicroBlaze程序,修改参数后不用再经过布局布线,方便调试。

典型的嵌入式程序设计流程如下:

如上图所示,在FPGA中开发嵌入式系统主要需要三个工具套件,分别为ISE,XPS和SDK。

ISE篇

先打开ISE,新建一个Project

我用的是黑金的AX309的板子

然后建一个Embedded Processor

XPS篇

建完后会自动打开XPS软件,点击Yes创建一个新的XPS Project

点击OK,使用AXI总线

选择Create a System for a Custom Board,Reference Clock Frequecy是板上的时钟频率,也可以是你用PLL生成的时钟然后输到MIcroBlaze系统的时钟频率,Optimization Strategy选择Area和Throughput都可以,在这里我选的是Area。点击Next

处理器频率选择100Mhz,Local Memory Size选择32KB,用于缓存你写的应用程序,尽量选大一些。不用添加其它外设,点击Finish即可

完了之后会生成一个基本的MicroBlaze系统,里面包含了MIcroBlaze系统所需的基本模块,如clock generator,axi4liite等等。

在这里,我们需要自己新建一个IP,在建IP之前,我们要先想好这个IP的功能和端口是什么,包括输入和输出端口,我目前要实现的功能是,通过检测按键KEY1,来开启和关闭流水灯,同时可以通过修改MIcroBlaze中的程序来改变流水灯的间隔时间以及按键检测的间隔时间,所以在这个自定义IP中,端口有两个,一个是控制4个LED灯亮的输出端口LED[3:0],一个是按键的输入端口dip。

首先,点击Hardware>>Create or Import Peripheral

点击next

选择Create templates for a new perphera,点击next

在这里有两个选择,上面那个是将你创建的外设安装到EDK的库中,这样下次再创建工程就可以直接利用你创建的外设,可重复利用,另外一个选项就是只用于当前XPS Project,在这里我们这个外设只在这个工程中使用,所以选择To an XPS Project,点击next。

为你创建的这个外设取名字,我这里取的是blink,你可以在description中添加对这个外设功能的描述。点击next

选择外设总线相连的协议,在这里选的是AXI4_Lite,点击next。

在这里需要勾选User logic software registers,表示我们是通过软件来更改寄存器的值,从而来更改我们所需要改变的参数的值。点击next

在这里我们选择寄存器的个数,一般有几个参数就选择几个寄存器,也可以把几个参数合在一个寄存器里,每个寄存器是32位的,总共可以选择32个寄存器,在这里我们需要修改两个参数(流水灯亮的间隔时间,按键检测的间隔时间),所以这里选择两个寄存器。

在这里不作修改,点击next

这里是选择是否生成仿真平台和仿真模型(Simulation Model),用于在ISim或Modelsim中进行仿真,在这里我们不需要仿真,不勾选,点击next

因为我们是用Verilog进行编程,所以需要勾选Generate stub“user logic” template in Verilog instead of VHDL,之后我们再对user logic模块进行修改时就可以用Verilog了,第三个勾选的话可以生成相关驱动,这样便可以利用驱动中的API函数了,不过不勾选也没关系,因为我们需要的函数在MIcroBlaze核里都有,在这里我们不勾选,点击next

点击finish

这个时候可以看到,在IP Catalog中的USER有我们创建的外设BLINK

在这里我们需要修改几个文件,首先右键BLINK>>view MPD,在## Ports处添加外设的端口LED[3:0]和dip

接下来是VHDL文件和Verilog文件,这两个文件在 工程路径\\

pcores\blink_v1_00_a\hdl文件夹中,我的路径是H:\project\EDK_test\system_test\pcores\blink_v1_00_a\hdl,

先修改VHDL文件,点击VHDL文件夹,打开blink,vhd。有三个地方修改,一个是entity这里需要添加端口

一个是user logic这里需要添加端口

最后一个就是generic map这里需要添加映射

这样VHDL文件便修改完了,然后再修改verilog文件

Verilog文件主要就是你要实现的功能的代码实现,有关AXI4相关的通信方面的连线及端口已经写好了,我们要做的是写自己的逻辑。

同样,我们user logic中也要先添加自己的端口LED和dip

通过软件控制的寄存器便是这两个寄存器

上图是有关写寄存器的操作,这里不需要更改,软件赋予寄存器什么值,相应的寄存器就会是什么值。

下图是有关寄存器读的一些操作,在这里我们可以修改,这样软件便可以读到我们想要的信号的值,比如下图中寄存器2写操作写的是设定按键检测的时间间隔,读操作的时候读的是dip也就是开关的状态

接下来就是自己为实现功能而写的一些模块,以下是为了实现功能而编写的Verilog文件

bcf09253f1791d8c0093fedc780b9581cc4.jpg

788ba9e2af0207f724e7d7460c1291c52f3.jpg

//User Logic//reg0 流水灯时间间隔//reg1 按键检测时间间隔,用于防抖//reg1 读入的时候读的是dip的状态

reg [31:0] timer;regtimer_enable;always @ (posedgeBus2IP_Clk)begin

if (Bus2IP_Resetn == 1'b0) begin

timer <= 32'b0;

end else if (timer == 4*slv_reg0) begintimer<= 32'b0;

end else if (timer_enable) begintimer<= timer + 1'b1;

end else begintimer<= 32'b0;

end

end

//按键间隔时间计数

reg [31:0] counter;always @ (posedgeBus2IP_Clk)begin

if (Bus2IP_Resetn == 1'b0) begin

counter <=32'b0;

end else if (counter == slv_reg1) begincounter<= 32'b0;

end else begincounter<= counter + 1'b1;

end

end

//检测按键的下降沿

regdip_temp1;regdip_temp2;wiredip_neg;always @ (posedgeBus2IP_Clk)begin

if (Bus2IP_Resetn == 1'b0) begin

dip_temp1 <= 1'b1;

end else if (counter == slv_reg1) begindip_temp1<=dip;end else begindip_temp1<=dip_temp1;end

end

//锁定检测dip的值

always @ (posedgeBus2IP_Clk)begin

if (Bus2IP_Resetn == 1'b0) begin

dip_temp2 <= 1'b1;

end else begindip_temp2<=dip_temp1;end

end

assign dip_neg = dip_temp2 & (~dip_temp1);//流水灯的主要状态机

reg [3:0] current_state;reg [3:0] next_state;parameter State_idle = 4'd0;

parameter First_LED = 4'd1;

parameter Second_LED = 4'd2;

parameter Third_LED = 4'd3;

parameter Last_LED = 4'd4;

always @ (posedgeBus2IP_Clk)begin

if (Bus2IP_Resetn == 1'b0) begin

current_state <=State_idle;end else begincurrent_state<=next_state;end

end

always@ (current_state,dip_neg,timer)beginnext_state= 4'dx;

case(current_state)

State_idle:begin

if (dip_neg) next_state =First_LED;else next_state =State_idle;endFirst_LED:begin

if (dip_neg) next_state =State_idle;else if (timer == slv_reg0 - 1) next_state =Second_LED;else next_state =First_LED;endSecond_LED:begin

if (dip_neg) next_state =State_idle;else if (timer == 2*slv_reg0 - 1) next_state =Third_LED;else next_state =Second_LED;endThird_LED:begin

if (dip_neg) next_state =State_idle;else if (timer == 3*slv_reg0 - 1) next_state =Last_LED;else next_state =Third_LED;endLast_LED:begin

if (dip_neg) next_state =State_idle;else if (timer == 4*slv_reg0 - 1) next_state =First_LED;else next_state =Last_LED;end

default:

next_state=State_idle;endcase

end

always @ (posedgeBus2IP_Clk)begin

if (Bus2IP_Resetn == 1'b0) begin

timer_enable <= 1'b0;

LED <= 4'b0000;

end else begin

case(next_state)

State_idle:begintimer_enable<= 1'b0;

LED <= 4'b0000;

endFirst_LED:begintimer_enable<= 1'b1;

LED <= 4'b0001;

endSecond_LED:begintimer_enable<= 1'b1;

LED <= 4'b0010;

endThird_LED:begintimer_enable<= 1'b1;

LED <= 4'b0100;

endLast_LED:begintimer_enable<= 1'b1;

LED <= 4'b1000;

end

default:begintimer_enable<= 1'b0;

LED <= 4'b0000;

end

endcase

end

end

View Code

可以看到,流水灯的时间间隔是受slv_reg0控制,按键检测的时间间隔受slv_reg1控制。

修改完成后,

记得一定要点击Project->Rescan User Repositories,这样修改才能生效

然后再添加自己创建的外设BLINK,添加进来后,点击PORT栏,将LED和dip设为External Port,如下图所示

完成上述修改后,先在XPS中点击Hardware>>Generate Netlist,然后返回到ISE中,新建一个V文件,用作顶层文件,来例化这个MIcroBlaze核

然后,编写UCF文件,将端口信号与管脚一一对应起来

最后,在ISE中点击生成Bit文件

生成完毕后,可以在ISE中先选中MIcroBlaze核再点击

Export Hardware Design To SDK with Bitsream,从而来打开SDK,如下图所示

也可以在XPS中点击

Hardware>>

Export Hardware Design To SDK,来打开SDK,区别不同就在于前者打开SDK后,可以在SDK直接烧写BIt文件到FPGA中,然后用SDK进行调试,后者是先需要在ISE中烧写Bit文件,然后再打开SDK进行调试。

SDK篇

打开SDK,选择一个路径作为workspace后,然后新建一个Application Project,点击File>>New>>Appication Project,

点击Finish,在生成的helloworld.c文件中进行程序编写

在这里,我先额外建了一个文件夹blink_led,放置写寄存器的操作

a82ce55ba5144d6d219b34ab43305091a3d.jpg

ddf320b92af0963ee8f7fe1db6b7bd55e13.jpg

/** blink_led.c

*

* Created on: 2018-5-23*/#include"blink_led.h"#include"xio.h"

//流水灯的间隔时间

voidset_LED_interval(uint32_t bassaddr_p, uint32_t num_ms, uint32_t num_us)

{//CLK 100MHZ

XIo_Out32((bassaddr_p) + 0x00000000, num_ms*100000 + num_us*100);

}//按键检测的间隔时间

voidset_dip_interval(uint32_t bassaddr_p, uint32_t num_ms)

{//CLK 100MHZ

XIo_Out32((bassaddr_p + 0x00000004), num_ms*100000);

}

View Code

其中寄存器的读写是靠xio.h中包含的API函数来进行操作的,所以要添加include“xio.h”,另外,此程序需要在helloword.c引用,所以也需要编写一个头文件,在helloword.c中进行程序的编写时需要包含进去

879fa762666569cc9e2f808e29873575697.jpg

af94fa3f8bf7341fc64b1fe9d4299897dbb.jpg

/** blink_led.h

*

* Created on: 2018-5-23*/#ifndef BLINK_LED_H_#define BLINK_LED_H_#include

voidset_LED_interval(uint32_t bassaddr_p, uint32_t num_ms, uint32_t num_us);voidset_dip_interval(uint32_t bassaddr_p, uint32_t num_ms);#endif /* BLINK_LED_H_ */

View Code

然后再在helloword.c中进行程序的编写

a863417d61eda1015982066492c47c50135.jpg

f0506bea7f706e34d610cb5ec77a610524a.jpg

*/#include#include"platform.h"#include"blink_led/blink_led.h"#include"xil_printf.h"

#define blink_LED_ADDR 0x7C600000

intmain()

{

init_platform();

set_LED_interval(blink_LED_ADDR,5000, 0);

print("set_LED_interval Completed\n");

set_dip_interval(blink_LED_ADDR,10);

print("set_dip_interval Completed\n");return 0;

}

View Code

在Debug之前,先设置Debug Configuration,勾上Connect STDIO to Console,这样,打印出来的信息就会显示在Console栏中。

至此整个自定义IP过程完成,接下来就是上电,将程序烧写进去进行调试就可以了。

原文出处:https://www.cnblogs.com/daixiaoyao/p/10817253.html

java sdk他edk de区别_EDK笔记——自定义IP核相关推荐

  1. java sdk他edk de区别_最低SDK版本/目标SDK版本与编译SDK版本之间有什么区别?

    公式是 minSdkVersion <= targetSdkVersion <= compileSdkVersion minSdkVersion-是一个标记,用于定义可在其上安装应用程序的 ...

  2. 【Xilinx AX7103 MicroBalze学习笔记6】MicroBlaze 自定义 IP 核封装实验

    目录 实验任务 实验框图 创建自定义 IP 封装 IP IP 封装界面配置 硬件设计(Vivado部分) Block Design搭建 添加 IP 库 约束文件 软件设计(SDK部分) 往期系列博客 ...

  3. 自定义IP核在SDK中添加驱动方法

    1.  在sdk的 xilinx tools的菜单下点击 2. 在红色框的位置点击new,把XPS工程所在的根目录添加进来.(注意,必须是工程的根目录) 3.点击菜单board support pac ...

  4. 野火FPGA征途Pro学习笔记(IP核)

    分频器 偶分频器 通过always语句,对系统时钟进型分频,例如4分频:对系统时钟进行计数四次,产生一个高电平的flag信号. 在后级模块中使用时,采用 系统时钟&&flag==1 的 ...

  5. JAVA SDK安装和环境变量配置

    JAVA的入门篇,也是Java新手必备的技能.一般都是环境的配置.现在我就JAVA SDK 的安装来写篇笔记,作为日后的参照. 操作步骤: 1.到java的官网下载一个Java SDK的安装包,建议是 ...

  6. vivado dds IP核笔记

    vivado dds IP核笔记 DDS IP核在vivado提供的GUI界面中,可以选择三种配置: Phase Generator and SIN/COS LUT (DDS) SIN/COS LUT ...

  7. java之yield(),sleep(),wait()区别详解-备忘笔记

    java之yield(),sleep(),wait()区别详解-备忘笔记 1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如 ...

  8. Java SDK和Java JDK的区别

    sdk.jdk.jre的区别 一.JDK与jre 简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境.SDK是Software Development Kit 一般指软件开 ...

  9. java aws_AWS学习笔记(八)--S3 JAVA SDK

    Amazon Simple Storage Service (Amazon S3)是面向 Internet 的存储服务,具有高扩展性.可靠性.安全性和快速价廉的特点,提供 99.999999999% ...

最新文章

  1. 唐文:挖掘产品生命周期潜藏的商业价值——应用性能管理
  2. ASP .NET MVC 之Entity Framework入门教程及源码
  3. html5控制gif速度,gif加速软件 教你加快GIF图片的播放速度
  4. 剑指offer (05):替换字符串中空格 (C++ Python 实现)
  5. 获取网络图片并异步更新UI
  6. 那些聪明人都是怎么提高情商的?
  7. 前端文档汇总(觉得对您有用的话,别忘了给点个赞哦 ^_^ !) 1
  8. mysql数据库导入视图表失败_一个mysqldump导出失败的案例分析
  9. 微信小程序map组件拖拽地图获取经纬度,地址,带定位点范围(中心点固定)
  10. 网络工程制图论文计算机,计算机工程制图教学的课业评价的论文
  11. oracle授权怎么收费,Oracle数据库如何授权收费(Database Licensing)
  12. mstar android 怎么连接电脑,Android:Mstar平台 HDMI OUT 静音流程
  13. 代码:批量图片格式转换(jpg-png)
  14. WPS 2010 页眉下方添加下划线
  15. mysql emoy表情_GitHub - PandaQAQ/PandaEmoView: emoji gif 表情图文混排,仿微信表情输入...
  16. 二维离散余弦变换(DCT)与二维离散反余弦变换(IDCT)C语言实现
  17. CAD中用lisp程序实现批量偏移_AutoCAD如何批量偏移
  18. File System | Debug | 如何查看文件挂载的分区以及分区大小
  19. 计算机一级考试:选择题汇总E(精简版)
  20. 12、Interface (接口)克隆

热门文章

  1. 数据结构与算法38-鸭棋
  2. 陶哲轩实分析习题8.3.4
  3. 计算机内存大小rom,rom容量(ram容量和rom容量谁大)
  4. Fortran基本知识
  5. 虚拟机没有USB网卡选项怎么解决
  6. Kattis Problem-Unique Snowflakes
  7. 2021外卖返利小程序饿了么美团外卖侠分销系统源码
  8. MySQL中json_extract()函数的用法实例
  9. C++ 使用海康威视SDK将视频推流到rtmp服务器
  10. golang 微信支付介绍