精华内容
下载资源
问答
  • STM32F103VET6 模仿正点原子工程。 移植 模板 STM32F103VET6 正点原子 移植 模板
  • 正点原子SYSTEM

    2019-11-13 19:14:48
    适合买了杂牌的板子,看的正点的书。里面有delay,sys和usart。版权归正点原子所有,仅供学习使用
  • 1)资料下载:正点原子资料下载中心 - 正点原子资料下载中心 1.0.0 文档​www.openedv.com2)对正点原子FPGA感兴趣的同学可以加群讨论:8767449003)关注正点原子公众号,获取最新资料更新...对...

    1)资料下载:

    正点原子资料下载中心 - 正点原子资料下载中心 1.0.0 文档www.openedv.com

    2)对正点原子FPGA感兴趣的同学可以加群讨论:876744900

    3)关注正点原子公众号,获取最新资料更新

    http://weixin.qq.com/r/hEhUTLbEdesKrfIv9x2W (二维码自动识别)

    流水灯作为一个经典的入门实验,其地位堪比编程界的“Hello,World”。对于很多电子 工程师来说,流水灯都是他们在硬件上观察到的第一个实验现象。流水灯是指多个LED灯按照 一定的时间间隔,顺序点亮并熄灭,周而复始形成流水效果。本章我们同样通过流水灯实验, 带你进入FPGA的精彩世界。

    本章包括以下几个部分:

    7.1 LED灯简介

    7.2 实验任务

    7.3 硬件设计

    7.4 程序设计

    7.5 下载验证

    7.1 LED灯简介

    LED,又名发光二极管。LED灯工作电流很小(有的仅零点几毫安即可发光),抗冲击和抗 震性能好,可靠性高,寿命长。由于这些优点,LED灯被广泛用在仪器仪表中作指示灯、液晶 屏背光源等诸多领域。

    不同材料的发光二极管可以发出红、橙、黄、绿、青、蓝、紫、白这八种颜色的光。图 7.1.1 是可以发出黄、红、蓝三种颜色的直插型二极管实物图,这种二极管长的一端是阳极,短的那 端是阴极。图 7.1.2是开发板上用的贴片发光二极管实物图。贴片二极管的正面一般都有颜色 标记,有标记的那端就是阴极。

    a4bae03e9876e156e6abf777c055fce4.png
    图 7.1.1 发光二极管实物图

    74c1de3107d7de32a8d1375c2c15d815.png
    图 7.1.2 贴片发光二极管实物图

    发光二极管与普通二极管一样具有单向导电性。给它加上阳极正向电压后,通过5mA左右 的电流就可以使二极管发光。通过二极管的电流越大,发出的光亮度越强。不过我们一般将电 流限定在3~20mA之间,否则电流过大就会烧坏二极管。

    7.2 实验任务

    本节实验任务是使开拓者开发板上的4个LED灯顺序点亮并熄灭,循环往复产生流水的现 象。

    7.3 硬件设计

    发光二极管的原理图如图 7.3.1所示,LED0到LED3这4个发光二极管的阴极都连到地(GND) 上,阳极分别与FPGA相应的管脚相连。原理图中LED与地之间的电阻起到限流作用。

    fcaab74ec211cffe8496eaa4e199c1c5.png
    图 7.3.1 LED灯硬件原理图

    本实验中,系统时钟、按键复位以及LED端口的管脚分配如下表 7.3.1所示:

    2d44114af5a7dbb486de0d36e4b6b215.png
    表 7.3.1 流水灯实验管脚分配

    7.4 程序设计

    由于二极管的阳极分别与FPGA相应的管脚相连,只需要改变与LED灯相连的FPGA管脚的电 平,LED灯的亮灭状态就会发生变化。当FPGA管脚为高电平时,LED灯点亮;为低电平时,LED 灯熄灭。

    本次设计的模块端口及信号连接如图 7.4.1所示:

    3321ea9fa5d2c084509b5b9938e09b40.png
    图 7.4.1 流水灯模块原理图

    由于人眼的视觉暂留效应,流水灯状态变换间隔时间最好不要低于0.1s,否则就不能清晰 地观察到流水效果。这里我们让流水灯每间隔0.2s变化一次。在程序中需要用一个计数器累加 计数来计时,计时达0.2s后计数器清零并重新开始计数,这样就得到了固定的时间间隔。每当 计数器计数满0.2s就让led灯发光状态变化一次。

    流水灯模块的代码如下:

    1 module flow_led(

    2 input sys_clk , //系统时钟

    3 input sys_rst_n, //系统复位,低电平有效

    4

    5 output reg [3:0] led //4个LED灯

    6 );

    7

    8 //reg define

    9 reg [23:0] counter;

    10

    11 //*****************************************************

    12 //** main code

    13 //*****************************************************

    14

    15 //计数器对系统时钟计数,计时0.2秒

    16 always @(posedge sys_clk or negedge sys_rst_n) begin

    17 if (!sys_rst_n)

    18 counter <= 24'd0;

    19 else if (counter < 24'd1000_0000)

    20 counter <= counter + 1'b1;

    21 else

    22 counter <= 24'd0;

    23 end

    24

    25 //通过移位寄存器控制IO口的高低电平,从而改变LED的显示状态

    26 always @(posedge sys_clk or negedge sys_rst_n) begin

    27 if (!sys_rst_n)

    28 led <= 4'b0001;

    29 else if(counter == 24'd1000_0000)

    30 led[3:0] <= {led[2:0],led[3]};

    31 else

    32 led <= led;

    33 end

    34

    35 endmodule

    本程序中输入时钟为50MHz,所以一个时钟周期为20ns(1/50MHz)。因此计数器counter 通过对50MHz系统时钟计数,计时到0.2s,需要累加0.2s/20ns=10000000次。在代码第22行,每 当计时到0.2s计数器清零一次。

    同时,每当计数器计数到10000000时,将各个LED灯的状态左移一位,并将最高位的值移 动到最低位,循环往复。其他时间,LED灯的状态不变。如代码中第29至32行所示。

    需要说明的是,led的初始值必须是一位为1,其它位为0,在循环左移的过程中才会呈现 流水灯的效果;而如果led的初始值为0,则左移后led的状态仍然为0。代码中led的初始值是 由复位信号(sys_rst_n)控制的,如代码中第27行和第28行所示。这里的复位信号对应的就 是板载的复位按键,尽管在上电后没有按下复位按键,由于FPGA芯片内部有一个上电检测模块, 一旦检测到电源电压超过检测门限后,就产生一个上电复位脉冲(Power On Reset)送给所有的 寄存器,led的初始值就是在这个时候复位成4’b0001的。

    我们在Modelsim中对流水灯程序进行仿真,为了减少仿真过程所需要的时间,将流水灯状 态变化的间隔时间修改为0.1ms。仿真得到的波形图如图 7.4.2所示,led端口寄存器的值按照 0001→0010→0100→1000→0001的顺序变化,对应的各个LED灯的接口电平依次改变。

    c2eafb3bee5ee49f63d5e3cafea9d225.png
    图 7.4.2 Modelsim仿真波形图

    仿真过程用到的测试程序如下所示:

    1 `timescale 1ns/1ns // 定义仿真时间单位1ns和仿真时间精度为1ns

    2

    3 module flow_led_tb(); // 测试模块

    4

    5 //parameter define

    6 parameter T = 20; // 时钟周期为20ns

    7

    8 //reg define

    9 reg sys_clk; // 时钟信号

    10 reg sys_rst_n; // 复位信号

    11

    12 //wire define

    13 wire [3:0] led;

    14

    15 //*****************************************************

    16 //** main code

    17 //*****************************************************

    18

    19 //给输入信号初始值

    20 initial begin

    21 sys_clk = 1'b0;

    22 sys_rst_n = 1'b0; // 复位

    23 #(T+1) sys_rst_n = 1'b1; // 在第21ns的时候复位信号信号拉高

    24 end

    25

    26 //50Mhz的时钟,周期则为1/50Mhz=20ns,所以每10ns,电平取反一次

    27 always #(T/2) sys_clk = ~sys_clk;

    28

    29 //例化led模块

    30 flow_led u0_flow_led (

    31 .sys_clk (sys_clk ),

    32 .sys_rst_n (sys_rst_n),

    33 .led (led )

    34 );

    35

    36 endmodule

    7.5 下载验证

    首先我们打开流水灯工程,在工程所在的路径下打开flow_led/par文件夹,在里面找到 “flow_led.qpf”并双击打开。注意工程所在的路径名只能由字母、数字以及下划线组成,不 能出现中文、空格以及特殊字符等。flow_led工程打开后如图 7.5.1所示。

    25456fbf8d79a4cac87f8743be81baf5.png
    图 7.5.1 流水灯工程

    工程打开后通过点击工具栏中的“Programmer”图标(图中红框位置)打开下载界面。

    下载界面如图 7.5.2所示,查看图中红色矩形框中是否已经加载下载文件(sof文件)。 如果没有,则需要通过点击“Add File”按钮添加流水灯工程中flow_led/par/output_files 目录下的“flow_led.sof”文件。

    7a15998ccad3e190fe0acef2fdf5703f.png
    图 7.5.2 程序下载界面

    如下图 7.5.3所示。将USB Blaster下载器一端连接电脑,另一端与开发板上的JTAG下载 口连接,如下图所示。然后连接电源线并打开电源开关。

    aa1a6e7423af841a11fe053dbf4bb7fe.png
    图 7.5.3 开拓者开发板实物图

    接下来我们下载程序,验证流水灯功能。

    开发板电源打开后,在程序下载界面点击“Hardware Setup”,在弹出的对话框中选择当 前的硬件连接为“USB-Blaster”。然后点击“Start”将工程编译完成后得到的sof文件下载 到开发板中,如图 7.5.4所示。

    b826ac824895700c71e5a4567aa741e2.png
    图 7.5.4 程序下载完成界面

    下载完成后,就能在开发板上看到流水灯的效果了。

    展开全文
  • 正点原子 FPGA代码

    2019-05-12 23:21:06
    正点原子 FPGA代码
  • 正点原子串口助手XCOM

    2020-11-14 08:37:31
    正点原子串口助手XCOM
  • 正点原子精英版原理图正点原子精英版原理图正点原子精英版原理图
  • 正点原子产品选型手册 正点原子产品选型手册 正点原子产品选型手册
  • 1)实验平台:正点原子开拓者FPGA 开发板2)摘自《开拓者 Nios II开发指南》关注官方微信号公众号,获取更多资料:正点原子3)全套实验源码+手册+视频下载地址:...

    1)实验平台:正点原子开拓者FPGA 开发板

    2)摘自《开拓者 Nios II开发指南》关注官方微信号公众号,获取更多资料:正点原子

    3)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/index.html

    http://weixin.qq.com/r/hEhUTLbEdesKrfIv9x2W (二维码自动识别)

    第三章PIO IP核

    PIO是一个带有Avalon接口的并行输入/输出(Parallel input/output)IP核,我们可以

    利用PIO来实现Qsys系统与外设的简单通信。在本章中,我们将详细讲解它的功能和使用方

    法,并在实验过程中带领大家了解Qsys系统是怎么与外界传递信息的。

    本章包括以下几个部分:

    3.1 简介

    3.2 实验任务

    3.3 硬件设计

    3.4 软件设计

    3.5 下载验证

    简介

    PIO IP核为 Avalon-MM 从端口和通用I/O端口提供了一个存储器映射(memory-mapped)

    接口。PIO的I/O端口可以连接到片内用户逻辑(verilog语言完成的电路部分),也可以连接

    到与外部器件相连的FPGA引脚。每个PIO核能提供最高32个I/O端口,用户可以在一个Qsys系

    统里添加多个PIO IP核。

    PIO 为用户逻辑或外围器件提供了简单的 I/O 控制,如控制 LED 灯、获取按键的电平变化

    信息、控制显示设备、与片外器件通信等。

    寄存器描述

    PIO IP核的寄存器相关信息如图图 3.1.1所示。

    562821f7e8f406a3731d70173c3681d5.png

    图 3.1.1 PIO IP核寄存器描述

    注:(1)这个寄存器的存在与否,取决于硬件配置。如果寄存器不存在,读寄存器时将会返回未定义

    的值。同理,写寄存器也是无意义的(no effect)。

    (2)如果将边沿捕获寄存器的位清除使能关掉,那么给边沿捕获寄存器写任意值都将把寄存器里的所

    有位清零。否则,给寄存器的某一位写 1,只会将写 1 的那一位清零。

    接下来我们将对表中的寄存器一一介绍:

    (1) 数据寄存器(data Register)

    读数据寄存器,将会返回输入端口的当前数据。如果PIO核的硬件设置为输出端口

    (output ports only),那么读数据寄存器将会返回未定义的值。

    将数据写到数据寄存器中,寄存器中的数据会被送到输出端口。如果PIO核的硬件设置为

    输入端口(input ports only),那么将数据写到寄存器中是没有作用的。如果PIO核的硬件

    设置为双向模式(bidirectional mode)时,只有当方向寄存器(direction)对应位的值为

    1的时候,才输出数据。

    (2)方向寄存器(direction Register)

    当PIO核的硬件设置为双向端口时(bidirectional ports),方向寄存器才会存在。PIO

    核设置为只输出或只输入模式时,方向寄存器不存在,此时读方向寄存器将会返回未定义的

    值,写方向寄存器也是无意义的。方向寄存器能够设置每一个端口的数据方向,当方向寄存

    器中的第n位设置为1时,n端口就会将数据寄存器(data)的第n位数据输出出去。方向寄存

    器中的第n位为0时,n端口将会把数据传输给数据寄存器的第n位。

    (3)中断屏蔽寄存器(interruptmask Register)

    只有当中断屏蔽寄存器的硬件设置为“Generate IRQ”时,这个寄存器才存在。如果硬

    件设置时未选中“Generate IRQ”,那么读中断屏蔽寄存器会返回未定义的值,写中断屏蔽

    寄存器无作用。复位后,中断屏蔽寄存器所有位为0,因此禁止所有PIO端口的中断。当中断

    屏蔽寄存器的某一位设为1 时,才能使相对应的PIO 输入口中断。注意,PIO IP 核的硬件配

    置只为输入口时才能进行中断操作。

    (4)边沿捕获寄存器(edgecapture Register)

    当硬件设置有边沿捕获功能时,边沿捕获寄存器才存在。否则,读边沿捕获寄存器会返

    回未定义的值,写边沿捕获寄存器无作用。要检测的边沿类型需要在PIO IP 核添加时设定。

    在输入口上检测到选定的边沿时,边沿捕获寄存器中对应位n置1。Avalon 主控制器通过读边

    沿捕获寄存器来判断,是否有某一个输入端口发生了边沿事件。写任意值到边沿捕获寄存器

    将使寄存器所有位清0。

    (5)置位和清零寄存器(outset and outclear Register)

    只有当“Enable individual bit set/clear output register”选项选中时,这类寄存

    器才存在。我们可以使用置位或清零寄存器设置输出端口的一些位为1 或0。举个例子,当我

    们想把输出端口的第6 位设置成1 时,我们把0x40 写入置位寄存器就可以了。当我们把0x08

    写入清零寄存器时,输出端口的第3 位就设置成0了。

    与PIO核相搭配的是altera_avalon_pio_regs.h文件,这个文件提供了和硬件之间的底层

    接触(low-level access)。开发者不能修改这个文件。

    PIO IP 核的配置界面介绍

    从设置界面中可以看到,IP核有5个部分可以配置,下面我们会讲解这些选项的功能。

    3db56bb6551b16c2190095acf27410fb.png

    图 3.1.2 PIO IP核配置界面

    (1)基础设置(Basic Settings)

    在基础设置部分,我们可以设置PIO端口的数据方向、位宽和复位值。

    Width

    前面提到,PIO核能提供最高32个I/O端口,也就是说PIO端口的数据位宽最大为32bits。

    在Width这一项,完成对端口位宽的设置;

    Direction

    我们可以将端口方向设置为表中的一种

    f150f7337a08d367de435718390b817f.png

    图 3.1.3 Direction设置

    输出端口复位值

    我们能确定输出端口的复位值。有效值的长度取决于端口位宽。

    (2)输出寄存器(Output register)

    “Enable individual bit set/clear output register”这个选项能让我们置位或清零

    各自独立的输出端口。当这个选项被选中之后,会出现两个额外的寄存器——置位寄存器、

    清零寄存器。我们可以用这些寄存器去确定要置位或清零的位。

    (3)边沿捕获寄存器(Edge capture register)

    当我们在Basic Settings中的Direction处选中Input选项时,PIO IP 核便允许我们选中

    边沿捕获和产生IRQ选项。当我们选择Output Ports 选项时,边沿捕获和产生IRQ 选项是无

    法选中的。当我们选中Synchronously capture 选项时,PIO IP 核中将包含边沿捕获寄存器

    (edge capture)。当一个输入端口产生了特定的边沿时,边沿捕获寄存器能让核检测或产

    生一个可选的中断。用户需要进一步指定以下功能:

    要检测的边沿种类

    Rising Edge 上升沿;

    Falling Edge 下降沿;

    Either Edge 上升或下降沿。

    选择了 enable bit-clearing for edge capture register 选项后,给 edge capture 寄存器单

    独的位写 1 清中断;若是没有选择 enable bit-clearing for edge capture register,则是写

    任意数清中断。

    当指定类型的边沿在输入端口出现时,边沿捕获寄存器对应位置1。当Synchronously

    capture 选项未选中时,边沿捕获寄存器不存在。

    (4)中断(Interrupt)

    当选中 Generate IRQ 选项时,若输入端口发生指定的事件,则 PIO IP 核发出 IRQ 中断。

    用户必须进一步设定 IRQ 事件产生的条件:

    Level 只要选中了中断功能并且输入为高电平,那么 PIO IP 核产生一个 IRQ。

    Edge 只要选中了中断使能功能且边沿捕获寄存器中相应位为 1,那么 PIO IP 核产生

    一个 IRQ。

    当Generate IRQ 选项未被选中时,不产生中断屏蔽寄存器。当硬件配置为电平触发方式

    时,只要选中了中断使能功能并且出现高电平,就发出一个中断。如果希望低电平时产生中

    断,则需在该I/O 输入引脚前将输入信号取反;当硬件配置为边沿触发方式时,只要选中中断

    使能功能并且捕获到边沿事件,就发出一个中断。中断(IRQ)一直保持有效直至禁止中断

    (中断屏蔽寄存器相应位清零)或清边沿捕获标志(向边沿捕获寄存器写一个任意值)为

    止。

    (5)仿真(Test bench wiring)

    由于这个功能不常用,所以这里就不进一步介绍了。

    实验任务

    本节实验任务是:在Qsys系统中加入PIO IP核,完成4个按键控制4个LED亮灭的实验,并

    实现上电自启动的功能。

    硬件设计

    创建 Quartus II 工程

    仿照第二章“Hello World”实验硬件设计部分来创建本次实验的文件目录以及Quartus

    II工程,工程名为“Pio_led”。

    创建 Qsys 系统

    本次实验相对应“Hello,World”实验,硬件上有一定的区别。由于本次实验要用到FPGA

    芯片外部的按键和LED,所以搭建的Qsys系统需要和外部器件进行通信,就要用到前面介绍的

    PIO IP核。另外实验任务要求能够实现上电自启动的功能,那么就需要用到非易失性存储器

    EPCS,也就是说需要添加EPCS Flash IP核。

    首先按照“Hello Wrold”实验所介绍的方法完成最基本的Qsys系统的搭建,要用到的IP

    核有:clk、nios II、onchip_ram、jtag_uart、sysid_qsys。接下来,我们来介绍一下如何

    给该Qsys系统添加并配置PIO和epcs_flash IP核。

    在Qsys工具的Library中搜索“PIO”,在搜索结果中双击PIO IP核可以打开如图 3.3.1

    所示的配置界面。

    33540004da503af40caa978e065caa2c.png

    图 3.3.1 PIO IP核配置界面

    我们先设置与LED灯相连的PIO。开发板上用户可用的LED灯共有4个,因此在“Basic

    Settings”一栏,我们将PIO位宽(Width)设置为4;除此之外,因为LED灯是一个输出设备

    (由FPGA输出的信号控制),所以我们把PIO的方向(Direction)设为输出(Output)即

    可。

    其它设置如Output Registere、Edge capture register等配置为默认设置,无需更改,

    点击Finish完成。修改完的PIO IP核界面如图 3.3.2所示。

    26fb07fe1af91a1c10047be6354a3306.png

    图 3.3.2 与LED灯相关的PIO IP核设置界面

    由于我们的实验任务是使用4个按键控制4个LED灯的亮灭,所以还要添加一个采集按键电

    平信号的PIO IP核。这里因为按键的电平信号是要输入给Qsys系统的,所以在Basic

    Settings里,我们将PIO位宽设为4,方向设为输入(Input)即可。由于本次实验用不到中断

    以及边沿相关的功能,其他的设置也为默认设置,无需修改。修改完的PIO IP核界面如图3.3.3所示。

    e31d2757603673bc5d3a6d630ee5f053.png

    图 3.3.3 与按键相关的PIO IP核设置界面

    紧接着,在Library中搜索epcs_flash IP核,双击打开后可以看到如图 3.3.4所示的配

    置界面。

    d21588d9dd682fb3de77aa13e52677cc.png

    图 3.3.4 epcs_flash IP核设置界面

    这里,epcs_flash IP核直接使用默认设置,点击Finish即可完成配置。由于这里只是使

    用这个IP核固化程序(让设计上电自启动),所以这里就不进一步详细介绍了。

    然后打开nios II IP核配置界面,因为这里使用的是epcs_flash IP核存储代码和指令,

    所以相关的设置需要进行修改。如图 3.3.5所示,在Reset Vector这一栏将Reset vector

    memory设置为epcs_flash即可,Exception Vector这一栏处还是使用onchip_ram。需要注意

    的是,在添加完epcs_flash和onchip_ram IP核之后,nios II IP核的Reset Vector和

    Exception Vector选项中才会出现epcs_flash以及onchip_ram选项。

    1ae5e5603592e6b1099d882d823ad140.png

    图 3.3.5 nios II IP核设置界面

    然后就是进行连线,大家若是不熟悉怎么连线,可以照着下面完成的Qsys系统界面图

    连。需要注意的是,要将PIO和epcs_flash IP核的端口引出来,如图 3.3.6所示。引出端口

    的方法是双击图 3.3.6中IP核的Export一栏的红框位置,然后修改名称,按下Enter键即可。

    然后,点击System→Assign Base Addresses让系统自动分配地址,这里最好把EPCS

    Flash的地址锁住,这是因为这个IP核里存储着指令,最好不要让其地址发生变动。锁住地址

    的方法是先点击IP核,然后点击右键→Lock Base Address。我们还可以将各个IP核的名称修

    改一下。最后就是生成系统了,操作可以按照“Hello,World”文档里的进行。

    120636dbbf45570ef97e9f6f5a5a073a.png

    图 3.3.6 Qsys系统界面

    集成 Qsys 系统

    这一步依然可以按照“Hello,World”文档里的操作进行。

    下面将Quartus II 工程中的顶层代码贴出来。

    1 module Pio_led(

    2 input sys_clk,

    3 input sys_rst_n,

    4

    5 //flash

    6 input flash_data0,

    7 output flash_sdo,

    8 output flash_sce,

    9 output flash_dclk,

    10

    11 input [3:0] key,

    12 output [3:0] led

    13 );

    14

    15 //wire define

    16 wire clk_100m ;

    17

    18 //例化 pll(锁相环)IP 核

    19 pll pll_inst (

    20 .inclk0 ( sys_clk ),

    21 .c0 ( clk_100m )

    22 );

    23

    24 //例化 Qsys 系统

    25 led u0 (

    26 .clk_clk (clk_100m ), // clk.clk

    27 .reset_reset_n (sys_rst_n), // reset.reset_n

    28 .epcs_flash_dclk (flash_dclk), // epcs_flash.dclk

    29 .epcs_flash_sce (flash_sce), // .sce

    30 .epcs_flash_sdo (flash_sdo), // .sdo

    31 .epcs_flash_data0 (flash_data0), // .data0

    32 .pio_led_export (led), // pio_led.export

    33 .pio_key_export (key) // pio_key.export

    34 );

    35

    36 endmodule

    编译和下载

    这时,我们便能够进行编译查错了,我们可以通过Quartus II 软件菜单栏中的

    【Processing】→【Start Compilation】来进行编译,也可以通过快捷栏中的快捷键进行编

    译。

    接下来我们就需要进行配置IO,分配管脚。首先,点击Quartus II 软件菜单栏中的

    【Assignment】→【Device】,然后我们在Device 界面中找到【Device and Pin

    Options…】进入图 3.3.7所示页面配置IO。将未使用引脚设置为高阻输入(As input tri-state),这样上电后FPGA 的所有不使用引脚都将进入高阻抗状态。

    6655a9b83eab291e013fe126a67d0a10.png

    图 3.3.7 未使用引脚设置界面

    接下来,将一些IO设置成普通IO,通过双击红框位置,将一个个Value的值修改过来。如

    图 3.3.8所示。

    d749ee543b77712e53df6f752160d364.png

    图 3.3.8 IO设置界面

    我们通过Quartus II 软件菜单栏中的【Assignments】→【Pin Planner】选项分配引

    脚,如图 3.3.9所示。

    6d8958f4c5013e3207e353492e669593.png

    图 3.3.9 引脚分配界面

    最后我们再进行一次全编译,成功编译硬件系统后,将产生用于配置FPGA的Pio_led.sof

    文件。下面我们就来说明一下将.sof 文件下载到FPGA目标器件的步骤。

    将下载器一端连接电脑,另一端与开发板上对应端口连接,最后连接电源线并打开电源

    开关。开拓者开发板实物图如下所示:

    865354a3c8efc89161976e5cf758f825.png

    图 3.3.10 开发板实物图

    接下来我们下载程序。工程打开后通过点击工具栏中的“Programmer”图标打开下载界

    面,通过“Add File”按钮选择Pio_ledparoutput_files 目录下的“Pio_led.sof”文

    件。开发板电源打开后, 在程序下载界面点击“Hardware Setup”,在弹出的对话框中选择

    当前的硬件连接为“USB-Blaster[USB-0]”。然后点击“Start”将工程编译完成后得到的

    sof文件下载到开发板中。

    这里只讲到了把配置文件下载到FPGA 中,掉电后FPGA 中的配置数据将会丢失。我们会

    在后面讲到掉电后数据不丢失的配置方法。至此,硬件部分设计完成,下面开始基于Nios II

    SBT for Eclipse 的软件部分的设计。

    软件设计

    我们通过Quartus II 软件菜单栏中的【Toos】→【Nios II SBT for Eclipse】,来启

    动Nios II SBT for Eclipse软件。打开Nios II SBT for Eclipse 软件后,会弹出

    Workspace Launcher 页面。我们这里将工作空间设置为Pio_ledqsys路径下的software文件

    夹,如图 3.4.1所示。

    2aa8788d3bef22b1885043f0c8257dd9.png

    图 3.4.1 设置工作空间

    设置好工作空间后,我们点击【OK】进入Nios II SBT for Eclipse 软件主界面中,在

    该页面我们通过单击菜单栏中的【File】→【New】→【Nios II Application and BSP from

    Template】,来新建工程,如图 3.4.2所示。

    041bd5ddca8b6df5f4f8b5dd581b4e42.png

    图 3.4.2 新建Nios II SBT for Eclipse 工程

    单击【…】按钮来选择Pio_ledqsyshardware下的Pio_led.sopcinfo文件,即指向当前

    硬件设计系统。Nios II SBT for Eclipse 软件会自动识别Qsys 系统中CPU 的名称,所以

    CPU name一项会自动生成。接下来,要给Nios II SBT for Eclipse 软件中的工程命名,这

    里的名称没有特殊要求,我们这里名为led。然后将工程存放的位置修改为

    Pio_ledqsyssoftware led。注意不要漏掉了“led”,不然生成系统的时候会报错。最

    后我们来看下Project template窗口,该窗口中陈列的都是已经设计好的软件工程。我们可

    以从中选择一个,作为自己的工程的模板来使用。当然也可以选择Bland Project(空白工

    程),就需要自己写所有的代码。这里我们选择的是Hello World 模板工程,然后我们在它

    的基础上进行修改,这样比空白工程更加方便。

    设置完工程后,直接点击【Finish】完成工程创建。然后,在Nios II SBT for Eclipse软件的左侧Project Explorer 窗口中有两个工程: led 和led _bsp。其中led 是C/C++应用

    工程,而led _bsp 是描述Qsys系统硬件细节的系统库。打开led工程里的hello_world.c文

    件,出现如图 3.4.3所示的图。

    4dd4cb29815fc324c47ec24fbcd656b6.png

    图 3.4.3 hello_world工程代码图

    由代码可知,下载程序到开发板后会在窗口上输出 “Hello from Nios II!”。我们在

    这里要先验证之前创建的Qsys系统是否能正常工作。验证方法是先编译led工程,然后将工程

    模板程序下载到开发板上,看是否能正常运行。方法是右键led工程,点击build project。

    Console窗口会报出下图这样的错误。

    a40d334f68431048d12ac5cc0d8703b2.png

    图 3.4.4 编译工程后的console窗口

    在“Hello,World”实验中也出现了类似的错误,其原因是存储空间不够。所以这里也要

    像“Hello,World”实验里一样,优化一下代码。方法是一样的,大家可以照着操作,这里就

    不再赘述了。

    优化完代码之后,再编译一次led工程,会出现以下的界面。这表示编译通过,可以将程

    序下载到开发板上了。

    fd196085b04103b648c9510f1dccd04f.png

    图 3.4.5 编译通过后的console窗口

    这时大家点击【Run As】→【Nios II Hardware】,然后点击【Target Connection】标

    签,然后在Target Connection 窗口中点击【Refresh Connections】按钮后。这时软件便会

    自动识别我们开发板上的Qsys 系统,并显示Qsys 系统的相关信息。我们接着点击【Run】,

    软件会把led.elf 文件下载至开发板中运行起来。更加详细的图和文字描述,可以在

    “Hello,World”实验的下载验证部分查看。

    这时,若之前创建的Qsys系统无误,代码下载完成后在Nios II console窗口会显示

    “Hello from Nios II!”字符,如下图所示。

    3ced6f2543e380a33430dde5f860dbc4.png

    图 3.4.6 下载代码后的Nios II console窗口

    验证完Qsys系统是否能正常运行之后,我们就可以开始软件部分的设计了。这时只需要

    在当前的代码窗口修改代码就可以了。代码如下所示。

    1 #include <stdio.h>

    2 #include "system.h" //系统头文件

    3 #include "alt_types.h" //数据类型头文件

    4 #include "altera_avalon_pio_regs.h"//pio 寄存器头文件

    5

    6 //---------------------------------------------------------------------------

    7 //-- 名称 : main()

    8 //-- 功能 : 程序入口

    9 //-- 输入参数 : 无

    10 //-- 输出参数 : 无

    11 //---------------------------------------------------------------------------

    12 int main(void)

    13 {

    14 alt_u32 key,led; //key 和 led 缓存变量

    15 while(1)

    16 {

    17 //读取按键的值,并赋值给 key。

    18 key = IORD_ALTERA_AVALON_PIO_DATA(PIO_KEY_BASE);

    19 //Key 按下时为低电平,没有按下时为高电平。Led 在高电平时亮,低电平灭。我们要将按键的值按

    位取反后,再赋值给 led。

    20 led = ~key;

    21 //用 led 的值控制 Led 亮灭。

    22 IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);

    23 }

    24

    25 return(0);

    26 }

    修改完代码的窗口如下所示:

    6953714a6e18eb3588ddab5efa24472d.png

    图 3.4.7 修改后的工程代码图

    代码修改完成后,大家记得要点一下快捷菜单中的【Save】,或者菜单栏中的【File】

    →【Save】,来保存修改后的程序。然后再编译led工程,并下载到开发板上。若代码下载完

    成后,按下开发板上的4个按键分别能控制4个led灯的亮灭。说明代码设计无误,可以开始下

    一步——让设计上电自启动。

    单击Nios II SBT for Eclipse 工具菜单栏中的【Nios II】→【Flash Programmer】,

    出现如图所示的界面。注意,在这一步开始之前,开发板上需要预先下载了sof文件,否则界

    面会报错。

    229818ec5cd031175c6e46d6709738cb.png

    图 3.4.8 Nios II Flash Programmer界面

    接下来点击Nios II Flash Programmer 工具菜单栏中的【File】→【New…】,出现如

    下图所示界面:

    b652557f5f90de589cf66b5a5bdc024c.png

    图 3.4.9 flash配置文件界面图

    这里配置有两种方法,一种方法是使用settings.bsp 文件,另一种是使用led.sopcinfo

    文件。这两种方法都可以完成配置任务,这里就讲解第一种方法的具体操作步骤。在选中bsp文件后,单击【OK】,出现如图所示界面:

    faf72ad5969bb9a902d767631ae2831a.png

    图 3.4.10 flash添加下载文件界面图

    单击【Add】,先将Qsys_First.sof 文件添加进去,然后再将Qsys_First.elf 文件添加

    进去。

    fa7c96885388bb66d441c4f818b871ec.png

    图 3.4.11 flash添加下载文件界面图

    Sof文件在Pio_ledparoutput_files目录下,elf文件在Pio_ledqsyssoftwareled目

    录下。文件添加完成后如图 3.4.12所示,此时就可以点击【Start】了。稍等一会,就会将

    两个文件固化到开发板的FPGA芯片中,就可以实现上电自启动的功能了。下载完成了出现下

    图所示界面:

    18bf05566939202f8a65914dbdc9943b.png

    图 3.4.12 flash下载完成界面图

    至此,固化程序的任务已经完成。

    下载验证

    由于我们已经将代码固化到开发板的芯片中,不需要再下载程序了。现在只需先断开电源,

    然后打开电源,分别按下 4 个按键,测试按键是否能分别控制 LED 的亮灭。若前面的操作无误

    的话,现在整个实验任务就已经实现了。

    展开全文
  • 时钟-正点原子.png

    2021-03-29 10:26:45
    时钟配置图-正点原子
  • 【实例简介】正点原子的STM32F103新战舰开发板的硬件原理图与PCB,且PCB含三维元器件封装。【实例截图】【核心代码】1d489e5a-fad4-4456-aeb8-622594716269└── STM32F103_Warship├── clean.bat├── debug....

    【实例简介】

    正点原子的STM32F103新战舰开发板的硬件原理图与PCB,且PCB含三维元器件封装。

    【实例截图】

    【核心代码】

    1d489e5a-fad4-4456-aeb8-622594716269

    └── STM32F103_Warship

    ├── clean.bat

    ├── debug.log

    ├── History

    │   ├── STM32F103_Warship.~(1).PcbDoc.Zip

    │   ├── STM32F103_Warship.~(1).PrjPcb.Zip

    │   ├── STM32F103_Warship.~(2).PcbDoc.Zip

    │   └── STM32F103_Warship.~(3).PcbDoc.Zip

    ├── __Previews

    │   ├── STM32F103_Warship_1.SchDocPreview

    │   ├── STM32F103_Warship_2.SchDocPreview

    │   ├── STM32F103_Warship_3.SchDocPreview

    │   ├── STM32F103_Warship_4.SchDocPreview

    │   ├── STM32F103_Warship_5.SchDocPreview

    │   ├── STM32F103_Warship.PcbDocPreview

    │   └── STM32F103_Warship.SchDocPreview

    ├── STM32F103_Warship_1.SchDoc

    ├── STM32F103_Warship_2.SchDoc

    ├── STM32F103_Warship_3.SchDoc

    ├── STM32F103_Warship_4.SchDoc

    ├── STM32F103_Warship_5.SchDoc

    ├── STM32F103_Warship.PcbDoc

    ├── STM32F103_Warship.PcbDoc.htm

    ├── STM32F103_Warship.PrjPcb

    ├── STM32F103_Warship.PrjPcbStructure

    └── STM32F103_Warship.SchDoc

    3 directories, 23 files

    展开全文
  • 1)摘自【正点原子】领航者 ZYNQ 之嵌入式开发指南2)实验平台:正点原子领航者ZYNQ开发板3)平台购买地址:https://item.taobao.com/item.htm?&id=6061601087614)全套实验源码+手册+视频下载:...

    1)摘自【正点原子】领航者 ZYNQ 之嵌入式开发指南

    2)实验平台:正点原子领航者ZYNQ开发板
    3)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761
    4)全套实验源码+手册+视频下载:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html
    5)对正点原子FPGA感兴趣的同学可以加群讨论:876744900
    6)关注正点原子公众号,获取最新资料

    496bb100149bf1610449cc2c6cbcee49.png

    第一章Hello World实验
    “Hello World!”是各种编程语言中最简单,同时也是最经典的入门实验。因此,我们将串口打印“Hello World”作为ZYNQ嵌入式系统的开篇实验,这也是我们步入ZYNQ的PS部分的始发点。通过本次实验我们将了解ZYNQ嵌入式系统的开发流程,熟悉ZYNQ嵌入式最小系统的搭建。
    本章包括以下几个部分:
    1.1简介
    1.2实验任务
    1.3硬件设计
    1.4软件设计
    1.5下载验证
    1.1简介
    首先我们来了解一下ZYNQ嵌入式系统的开发流程。

    5230fa187bf07282507c34f671f39241.png

    图 1.1.1 ZYNQ嵌入式系统开发流程
    如上图所示,开发流程大体可以分为6步。其中step1至step4为硬件设计部分,在Vivado软件中实现;step5为软件设计部分,在SDK软件中实现;step6为功能的验证。复杂的程序还涉及Debug,这个也是在SDK软件中实施。具体每一步的操作我们会在后面详细介绍。
    在简单了解ZYNQ嵌入式系统的开发流程后,接下来我们来看一下什么是ZYNQ嵌入式最小系统。ZYNQ嵌入式最小系统的概念包括以下两个方面:一、它是使系统正常工作的最小条件;二、它是其他系统建立的基础。

    a79daad990a717bd96e21be85b72765c.png

    图 1.1.2 ZYNQ嵌入式最小系统
    如图 1.1.2所示,以ARM Cortex-A9为核心、DDR3为内存,加上传输信息使用的UART串口就构成了ZYNQ嵌入式最小系统。可以看到,这个最小系统只包括了ZYNQ中的PS部分。
    下面我们将按照ZYNQ嵌入式系统开发流程,一步步的搭建上图所示的最小系统。
    1.2实验任务
    本章的实验任务是在领航者ZYNQ开发板上搭建ZYNQ嵌入式最小系统,并使用串口打印“Hello World”信息。
    1.3硬件设计
    在图 1.1.1中,我们将step1至step4划分为硬件设计部分。
    step1:创建Vivado工程
    1-1 打开Vivado,进入Vivado界面后,点击“Quick Start”栏的 “Create Project”。然后在弹出的创建Vivado工程向导界面,点击“Next”。如下图所示:

    acc712472cf0386e11c0633068bd051e.png

    图 1.3.1 点击创建工程

    bc74a8062829ae8d1b63fa6c794ec1b5.png

    图 1.3.2 创建工程向导
    1-2 进入工程命名界面。设置工程名为“hello_world”,工程路径可使用任意路径,本章我们将该工程放在F:ZYNQEmbedded_System文件夹下。注意,工程名和路径只能由英文字母、数字和下划线组成,不能包含中文、空格以及特殊字符!
    确认已经勾选“Create project subdirectory”,点击“Next”,如下图所示:

    0da129a56fe0168fbe045ee62b5a7c42.png

    图 1.3.3 设置工程信息

    1306a7597d03964b9549d7923e4f774d.png

    图 1.3.4 选择工程类型
    1-3 进入图 1.3.4所示的界面,在此界面设置工程类型。此处我们选择 “RTL Project”。本次实验不需要添加源文件和约束文件,所以勾选“Do not specify sources at this time”。勾选之后会省略后面添加源文件和约束文件的步骤,点击“Next”直接跳到器件选型界面。
    1-4 器件选型界面。所选择的器件型号一定要跟领航者核心板上的ZYNQ芯片型号保持一致。领航者核心板上的ZYNQ芯片有两种型号,XC7Z010和XC7Z020。大家可以通过查看核心板上ZYNQ芯片的私印来确认所使用的芯片型号。这两个芯片主要的差异是PL部分的逻辑资源不同,PS部分相同,另外XC7Z010型号速度等级speed为“-1”,XC7Z020的为“-2”,这在器件选型的时候需要注意。此处以XC7Z020为例。
    选择器件型号的方式有两种,一种是根据Parts,另一种是根据Boards,此处我们使用Parts选择器件。在Family栏里选择“Zynq-7000”, Speed栏选择“-2”,需要注意的是,在Package栏选择“clg400”。然后根据所使用的领航者核心板上的ZYNQ芯片型号,在下面的器件列表中选择“xc7z020clg400-2”,如下图所示。若是XC7Z010,相对应的器件为“xc7z010clg400-1”。

    267f2dc6bd8d742e1866aae28cab17d0.png

    图 1.3.5 器件选型界面


    选中之后,点击“Next”。
    1-5 工程摘要界面。这是创建工程的最后一步,显示工程摘要信息,如图 1.3.6所示。在此界面检查前面所设置的工程名称、所选择的器件型号等信息。如果发现工程设置有误,则可以通过Back按钮返回前面的步骤,重新设置。检查无误后点击“Finish”,完成工程创建。
    工程创建完成后的Vivado界面如图 1.3.7所示。

    c5eb7127b60dfafd8e04852a8392e884.png

    图 1.3.6 工程摘要界面


    图 1.3.7 工程创建完成后的Vivado界面
    step2:使用IP Integrator创建Processing System
    Vivado开发套件中提供了一个图形化的设计开发工具——IP 集成器(IP Integrator),在IP集成器中可以非常方便的插入各种功能模块(IP)。它支持关键IP接口的智能自动连接、一键式IP子系统生成、实时DRC等功能,能够帮助我们快速组装复杂系统,加速设计流程。
    接下来我们将在IP集成器中完成ZYNQ嵌入式系统的搭建。
    2-1 在左侧导航栏(Flow Navigator)中,单击IP Integrator下的Create Block Design。然后在弹出的对话框中指定所创建的Block Design的名称,在Design name栏中输入“system”。如下图所示:

    0a6a1e91f69aaeffa69ee540f8772317.png

    图 1.3.8 创建 Block Design


    2-2点击“OK”按钮,此时Vivado界面如下图所示。注意右侧的Diagram窗口,我们将在该窗口中以图形化的方式完成设计。

    d763475e7e82e28ad51de222283015a4.png

    图 1.3.9 Block Design界面


    2-3 接下来在Diagram窗口中给设计添加 IP。点击上图中箭头所指示的加号“+”,会打开IP目录(IP Catalog)。也可以通过快捷键Ctrl + I,或者右键点击Diagram工作区中的空白位置,然后选择“ADD IP”。
    2-4 打开IP目录后,在搜索栏中键入“zynq”,找到并双击“ZYNQ7 Processing System”,将ZYNQ7处理系统IP添加到设计中。

    b3c9ff2d6538384b4312ec91b049d9c4.png

    图 1.3.10 添加ZYNQ7 Processing System IP


    2-5 添加完成后,ZYNQ7 Processing System模块出现在Diagram中,如下图所示:

    48abf3a3886ebd86c175fb153ff6ef96.png

    图 1.3.11 ZYNQ7 Processing System IP


    2-6 双击所添加的ZYNQ7 Processing System模块,进入ZYNQ7处理系统的配置界面。界面左侧为页面导航面板,右侧为配置信息面板。如下图所示:

    60e9d6317042db9e3bc9e473edec11e4.png

    图 1.3.12 ZYNQ7处理系统配置界面


    下面我们简要地介绍一下页面导航面板中各个页面的作用。
    在Zynq Block Design页面,显示了Zynq处理系统(PS)的各种可配置块,其中灰色部分是固定的,绿色部分是可配置的,按工程实际需求配置。可以直接单击各种可配置块(以绿色突出显示)进入相应的配置页面进行配置,也可以选择左侧的页导航面板进行系统配置。
    PS-PL Configuration页面能够配置PS-PL接口,包括AXI、HP和ACP总线接口。
    Peripheral IO Pins页面可以为不同的I/O外设选择MIO/EMIO配置。
    MIO Configuration页面可以为不同的I/O外设具体配置MIO/EMIO。
    Clock Configuration页面用来配置PS输入时钟、外设时钟,以及DDR和CPU时钟等。
    DDR Configuration页面用于设置DDR控制器配置信息。
    SMC Timing Calculation页面用于执行SMC时序计算。
    Interrupts页面用于配置PS-PL中断端口。
    2-7 配置PS的UART。点击Peripheral I/O Pins页面,出现以下IO引脚配置界面。

    d0f6a642d85782fa1f1780a2a01aa21e.png

    图 1.3.13 配置ZYNQ7 Processing System的UART


    PS和外部设备之间的连接主要是通过复用的输入/输出(Multiplexed Input/Output,MIO)来实现的。PS的54个MIO引脚可以用于连接不同的外设接口,如图 1.3.13中的MIO14和MIO15,既可以配置成UART0的引脚接口,也可以配置成I2C0或CAN0的引脚接口。最终所选择的配置需要与领航者开发板的原理图相对应。

    acb560d0ff40f4035ceb9882e9ebdfcc.png

    图 1.3.14 领航者核心板原理图


    图 1.3.14是领航者核心板原理图的一部分。从图中我们可以看到,BANK500中的MIO14和MIO15被用作UART串口通信的引脚,并最终与底板上的USB转串口芯片CH340连接。因此,为了实现串口通信的功能,我们需要在PS中将MIO14和MIO15配置成 UART0模块的接口引脚。
    如下图所示,我们在MIO14和MIO15下点击UART0,方框的颜色会变成绿色,与此同时这两个MIO也会变成绿色。这就表明MIO14和MIO15被配置成了UART接口引脚,它们与PS中的串口电路UART0相连接。

    57ecf668034feb1efa5357c4d78c623f.png

    图 1.3.15 选中UART0


    点击左侧的MIO Configuration页面,在右侧展开I/O Peripherals > UART0,可以看到更具体的引脚配置信息。其中MIO14作为RX引脚、MIO15作为TX引脚,如下图所示:

    8a50b4416d2d404021a6d283a6138afa.png

    图 1.3.16 UART0的具体引脚配置


    点击左侧的PS-PL Configuration页面,我们可以在这里设置UART0串口通信的波特率。在General目录下,可以看到UART0的波特率默认是115200。通过下拉按钮可以选择其他波特率,一般保持默认设置。

    47c88bfd565c99c9bd69777d79ec6e00.png

    图 1.3.17 选择UART0的波特率


    2-8 配置PS的DDR3控制器。
    点击左侧的DDR Configuration页面,在右侧DDR Controller Configuration下的“Memory Part”一栏选择DDR的器件,XC7Z020的核心板选择MT41J256M16RE-125,XC7Z010的核心板选择MT41J128M16 HA-125。需要注意的是,我们在这里选择的型号并不是领航者核心板上的DDR3型号,而是参数接近的型号,或者说兼容的型号。其他的配置选项保持默认即可。

    ca9880bafae47d097732892e6f56522c.png

    图 1.3.18 配置PS的DDR3控制器


    2-9 配置PS的时钟。
    点击左侧的Clock Configuration页面,该界面主要是配置ZYNQ PS中的时钟频率。比如输入时钟默认是33.33333Mhz,这与我们领航者核心板上的PS端输入时钟频率相同。对于CPU的时钟、DDR的时钟以及其它外设的时钟,我们直接保持默认设置即可。如下图所示:

    a47de86fde3f45df0513207ae6fe5bbf.png

    图 1.3.19 配置PS的时钟


    2-10 因为本实验是搭建ZYNQ的嵌入式最小系统,只需要使用ZYNQ中的PS端。因此我们将PS中与PL端交互的接口信号移除。
    同样是在Clock Configuration页面,展开PL Fabric Clocks,取消勾选FCLK_CLK0,如下图所示:

    fb66d2c854b16a1226da5ce491d9257b.png

    图 1.3.20 去掉勾选FCLK_CLK0


    点击左侧的PS-PL Configuration页面,然后在右侧展开General下的Enable Clock Resets,取消勾选其中的FCLK_RESET0_N。
    另外在当前界面中展开AXI Non Secure Enablement下的GP Master AXI Interface,取消勾选其中的M AXI GP0 interface。如下图所示:

    9b50425210c24fcf6f41ef98e354576e.png

    图 1.3.21 取消勾选FCLK_RESET0_N和M AXI GP0 interface


    2-11 配置ZYNQ7 Processing System完成,点击“OK”。
    返回到Vivado界面后,在Diagram中可以看到ZYNQ7 Processing System IP模块发生了变化,如图 1.3.22所示。 我们将其与图 1.3.11作对比可以发现,ZYNQ7 PS模块少了四个接口,这正是因为我们在配置ZYNQ7 PS的过程中移除了与PL相关的接口信号。

    9025c89a34768062be5e81251f5090c5.png

    图 1.3.22 点击Run Block Automation


    2-12 我们点击上图中箭头所指示的位置“Run Block Automation”,会弹出如下图所示的对话框:

    db2eac157b487986a67354e462fe8871.png

    图 1.3.23 完成对ZYNQ7 Processing System IP核的配置


    在该界面中我们可以选择自动连接IP模块的接口,包括导出外部端口,甚至可以自动添加模块互联过程中所需的IP。在我们本次设计中只有一个IP模块,在左侧确认勾选processing_system7_0,然后点击“OK”。
    此时ZYNQ7 PS模块引出了两组外部接口,分别是DDR和FIXED_IO,引出的接口将会被分配到ZYNQ器件具体的引脚上。大家也可以通过点击ZYNQ7 PS模块接口处的加号“+”,来展开这两组接口,观察其中都有哪些信号。如下图所示:

    178c6a6cc48c13d1dae616893fbab44b.png

    图 1.3.24 配置完成后的ZYNQ7 Processing System


    2-12 本次实验不需要添加其它IP,直接按快捷键Ctrl+S保存当前设计。接下来点击下图箭头所指示的按钮,验证当前设计。验证完成后弹出对话框提示没有错误或者关键警告,点击“OK”,如下图所示:

    b6e0a880e42b48c41dd40f93eda7d39e.png

    图 1.3.25 验证设计


    如果验证结果报出错误或者警告,大家需要重新检查自己的设计。
    step3:生成顶层HDL模块
    3-1 在Sources窗口中,选中Design Sources下的sysetm.bd, 这就是我们刚刚完成的Block Design设计。右键点击sysetm.bd,在弹出的菜单栏中选择“Generate Output Products”,如下图所示:

    d7d3c12441b056ef00b91df249c05d0c.png

    图 1.3.26 选择Generate Output Products


    3-2 弹出“Generate Output Products”对话框,如下图所示:

    8c538d2bb46230841004861f7a020e48.png

    图 1.3.27 设置Generate选项


    在对话框中Synthesis Options选择Global;Run Setings用于设置生成过程中要使用的处理器的线程数,进行多线程处理,保持默认或设置为个人电脑处理器最大可使用线程数都可以,一般选择最大可使用线程数的一般。然后点击“Generate”来生成设计的综合、实现和仿真文件。
    在“Generate”过程中会为设计生成所有需要的输出结果。比如Vivado工具会自动生成处理系统的XDC约束文件,因此我们不需要手动对ZYNQ PS引出的接口(DDR和FIXED_IO)进行管脚分配。
    Generate完成后,在弹出的对话框中点击“OK”。
    在Sources窗口中,点击“IP Source”标签页,可以看到Generate过程生成的输出结果。

    0a22bf79005c06beff9a14f0af003603.png

    图 1.3.28 block design生成的结果


    3-3 在“Hierarchy”标签页再次右键点击system.bd,然后选择“Create HDL Wrapper”。

    61e8f48601081ce9640ac38786013529.png

    图 1.3.29 生成顶层模块


    在弹出的对话框中确认勾选“Let Vivado manage wrapper and auto-update”,然后点击“OK”。

    f11abcb7a07a4e87761e012673080d27.png

    图 1.3.30 创建顶层HDL封装


    创建完成后,Design Sources结构如下图所示:

    9e9117faf471ba91d4b7d6fadb9100d7.png

    图 1.3.31 生成system_wrapper.v顶层文件


    system_wrapper.v为创建的Verilog文件,箭头所指的“品”字形图标指示当前模块为顶层模块。该模块使用Verilog HDL对设计进行封装,主要完成了对block design的例化,大家也可以双击打开该文件查看其中的内容。
    另外我们在图 1.3.30中勾选了“Let Vivado manage wrapper and auto-update”,这样我们在修改了Block Design之后就不需要再重新生成顶层模块,Vivado工具会自动更新该文件。
    step4:生成Bitstream文件并导出到SDK
    如果设计中使用了PL的资源,则需要添加引脚约束并对该设计进行综合、实现并生成Bitstream文件。由于本次实验未用到PL部分,所以无需生成Bitstream文件,只需将硬件导出到SDK即可。
    4-1 导出硬件。
    在菜单栏选择 File > Export > Export hardware。

    d420a254e8aecd8a6863e844136c0dc5.png

    图 1.3.32 导出硬件


    在弹出的对话框中,因为没有生成bitstream文件,所以无需勾选“Include bitstream”,直接点击“OK”按钮。

    a570faf38cd05d6b94f9d3034364d895.png

    图 1.3.33 无需勾选“Include bitstream”


    在上图中,因为选择了“Exort to ”,Vivado工具会在当前工程目录下新建一个文件夹,名为“hello_world.sdk”,它是我们接下来软件开发的工作空间。
    在Export Hardware的过程中,工具会将硬件以一个ZIP压缩文件的形式导出到该工作空间中,文件名为“system_wrapper.hdf”。该文件包含了我们前面所搭建的硬件平台的配置信息,其后缀名.hdf的含义为“Hardware Definition File”,即硬件定义文件。
    4-2 硬件导出完成后,在菜单栏中选择File > Launch SDK,启动SDK开发环境。如下图所示:

    1cafdb1ce81fad5b114b495dd929ee5d.png

    图 1.3.34 启动SDK开发环境


    在弹出对话框中,直接点击“OK”,如下图所示:

    f54fd199212ec4f304eb8360d45f1cc0.png

    图 1.3.35 设置工作空间


    到这里,我们已经完成了ZYNQ嵌入式系统的硬件设计部分。接下来需要到SDK软件中进行应用程序开发,也就是软件设计部分。
    1.4软件设计
    在硬件设计的最后,我们启动了软件开发环境(SDK,Software Development Kit),如下图所示:

    760684a9dfa4df50f92c30ff7499dbe4.png

    图 1.4.1 SDK开发环境界面


    SDK打开后,主页面会显示硬件描述文件system.hdf的内容。如图 1.4.1所示,system.hdf标签页显示了整个PS系统的地址映射信息。
    大家应该还记得,在启动SDK之前,我们将硬件以一个ZIP压缩文件(system_wrapper.hdf)的形式导出到软件的工作空间。在SDK启动时,该文件会自动解压,大家可以在图 1.4.1的左侧看到解压后的所有文件。其中,前四个文件(ps7_init_gpl.c、ps7_init_gpl.h、ps7_init.c和ps7_init.h)包含了Zynq SOC处理系统的初始化代码,以及DDR、时钟、pll和MIO的初始化设置信息。在初始化过程中,SDK使用这些信息去配置相应的模块,使得应用程序能够在PS上运行。
    step5:在SDK中创建应用工程
    5-1 在菜单栏选择File > New > Application Project, 新建一个SDK应用工程。

    e5d9d6d964864b8748d19f19e4d4fc0a.png

    图 1.4.2 新建应用工程


    5-2 在弹出的对话框中,输入工程名“hello_world”,其它选项保持默认即可,点击“Next”。

    3c2d222ecf25455e06f8cefd27bba1ef.png

    图 1.4.3 配置工程


    5-3 选择工程模版Hello World,然后点击“Finish”。

    735b676cfbd150c97eabbcfb73d0b7a4.png

    图 1.4.4 选择工程模版Hello World


    5-4 SDK创建了一个hello_world应用工程和hello_world_bsp板级支持包(BSP)工程。同时工具会自动对工程进行编译,并生成ELF文件“hello_world.elf”,如下图所示:

    8ade31e82503deb2d16826ce9ff553e9.png

    图 1.4.5 工程创建后的界面


    另外工程创建完成后,SDK主界面会打开BSP工程目录下的system.mss文件。MSS是英文Microprocessor Software Specification的缩写,即微处理器软件说明。该文件包含BSP的操作系统信息、硬件设计中各个外设的软件驱动等信息。
    5-5 双击打开hello_world/src工程目录下helloworld.c文件,可以看到源代码如下:

    1. 1 #include
    2. 2 #include "platform.h"
    3. 3 #include "xil_printf.h"
    4. 4
    5. 5 int main()
    6. 6 {
    7. 7 init_platform();
    8. 8
    9. 9 print("Hello World");
    10. 10
    11. 11 cleanup_platform();
    12. 12 return 0;
    13. 13 }

    复制代码


    可以看到程序中主函数调用了3个函数,分别是init_platform()、cleanup_platform()和print()函数。我们将鼠标停留在各个函数名上,SDK就会显示该函数的声明。如果想查看函数的定义,可以按住Ctrl键不放,用鼠标点击相应的函数,就会跳转到其定义的地方。
    init_platform和cleanup_platform函数定义如下:

    f870797db1163b8ef11f50dd1351758f.png

    图 1.4.6 init_platform和cleanup_platform函数定义


    可以看到init_platform函数的作用是使能caches和初始化uart;cleanup_platform函数的作用是取消使能caches。实际上这两个函数在该工程中并没有启动任何作用,因为这两个函数是针对于特定平台如Microblaze的,对于我们使用的ZYNQ平台而言是不起作用的,所以main函数中只需包含第9行的print语句就可以了,出于平台的通用性和可移植性,此处我们保留这两个函数。
    另外需要注意程序中打印字符串“Hello World”使用的是print()函数,而不是C语言里的printf()函数。print()函数是Xilinx定义的一个用于打印字符串的函数,调用该函数需要包含头文件“xil_printf.h”。
    5-6 在我们修改并保存源文件后,SDK会自动对工程进行编译。编译进度可以在工具下方的控制台面板(Console)中进行查看,编译完成后控制台会显示信息“Finished building”,如下图所示:

    6e76bb5c5c0405b7eec554d038821815.png

    图 1.4.7 编译完成


    我们也可以在工具栏中点击“Build All”或通过快捷键Ctrl+B来编译工程,如下图所示:

    81a2e134fcfee6457b74a59ebc3eae3b.png

    图 1.4.8 编译工程


    到这里我们已经完成了本次实验的软件设计部分。
    1.5下载验证
    首先我们将下载器与领航者底板上的JTAG接口连接,下载器另外一端与电脑连接。然后使用Mini USB连接线将开发板左侧的USB_UART接口与电脑连接,用于串口通信。最后连接开发板的电源,并打开电源开关。如下图所示:

    e45015dd10b0d3e45fce07d9c120d5ed.png

    图 1.5.1 领航者ZYNQ开发板实物图


    注意第一次连接领航者底板上的USB_232接口时,需要安装USB串口驱动。在开发板随附的资料中找到“6_软件资料/1_软件/CH340驱动(USB串口驱动)”文件夹,双击打开文件夹中的“SETUP.EXE”进行安装,驱动安装界面如下图所示。界面中提示INF文件为CH341SER.INF,我们不需要理会(CH341,CH340驱动是共用的),直接点安装即可。

    68cfeb318fa53943c8644db2b179c79a.png

    图 1.5.2 安装USB串口驱动


    step6:板级验证
    6-1 在SDK软件的下方,找到SDK Terminal窗口。如果界面中没有找到该窗口,或者操作过程中把该窗口给关闭了,则可以通过在菜单栏中选择Window > Show View > Other,在Show View窗口中搜索添加SDK Terminal。

    434b8afc11f88336b88a41d0b87a78fe.png

    图 1.5.3 SDK软件自带的串口终端


    如上图所示,在SDK Terminal窗口中点击右上角的加号“+”连接串口,并在弹出的窗口中对串口进行设置。设置的参数需要与硬件设计过程中配置的UART0保持一致,即波特率为115200,数据位为8位,停止位为1位。如下图所示:

    8dd34a8cfded0ee539798b04aceff198.png

    图 1.5.4 设置UART串口


    需要注意的是,在设置串口端口(Port)时,在下拉列表中可能会看到多个可选端口。我们需要选择与领航者底板上的串口所连接的端口,具体的端口号可在计算机设备管理器中查看。因为底板上使用的USB转串口芯片型号为CH340,因此在设备管理器中找到USB-SERIAL CH340所对应的端口,在我这台电脑上该端口号为COM12。如下图所示:

    c3d6a655d70e2007b9566ac60f9428e2.png

    图 1.5.5 查看串口端口


    6-2 下载程序。右键点击hello_world工程,在弹出的菜单栏中选择Run as > 1 Launch on Hardware (sysntem Debugger),如下图所示:

    e67f22a2208c36daec5f248d5f0f5315.png

    图 1.5.6 下载程序
    6-3 下载完成后,应用程序会将字符串“Hello World”通过ZYNQ PS端的串口模块UART0发送出去。在SDK Terminal窗口可以看到上位机接收到的字符串,如下图所示:

    7adad9d721690b613b82efac30d9a00e.png

    图 1.5.7 程序运行结果
    程序成功打印出了“Hello World”字符串,说明本次实验在领航者ZYNQ开发板上面下载验证成功。

    展开全文
  • 正点原子UCOS学习资料

    2020-08-01 20:55:08
    这几天学习用在STM32上的操作系统,这个是正点原子UCOS学习资料,将他分享出来,方便大家学习呀。
  • 正点原子老版本SDK库,
  • 正点原子STM32例程.rar

    2020-09-17 08:58:20
    正点原子STM32例程
  • 正点原子+机智云教程

    2018-04-01 23:54:37
    正点原子提供免费开源的的连接机智云平台开发教程和实例源码。2017年6月,正点原子与机智云正式签订战略合作,推出机智云系列教程,所有正点原子的开发板都可以轻松连云了,几小时搞定远程控制。
  • 正点原子DMP代码.zip

    2021-04-22 09:51:33
    正点原子的MPU6050的DMP驱动代码,实测可用,自己移植的话重定向i2c函数即可
  • 正点原子_新起点_FPGA

    2018-11-03 09:56:25
    正点原子_新起点_FPGA.
  • FlappyBird正点原子mini

    2018-07-06 09:58:39
    FlappyBird正点原子mini,完美运行,直接烧写进去。需要的朋友拿走,嵌入式。
  • 正点原子开发板APOLLO 点亮RGB LCD例程
  • 1)摘自【正点原子】领航者 ZYNQ 之嵌入式开发指南2)实验平台:正点原子领航者ZYNQ开发板3)平台购买地址:https://item.taobao.com/item.htm?&id=6061601087614)全套实验源码+手册+视频下载:...
  • 1)实验平台:正点原子STM32mini开发板2)摘自《正点原子STM32 不完全手册(HAL 库版)》关注官方微信号公众号,获取更多资料:正点原子第六章 跑马灯实验STM32最简单的外设莫过于IO口的高低电平控制了,本章将通过一个...
  • 正点原子ministm32开发板,之前的版本有走线电路图,可供参考设计
  • 正点原子mini脱机下载器资料包 ,正点原子mini脱机下载器资料包
  • 1)实验平台:正点原子Linux开发板2)摘自《正点原子I.MX6U嵌入式Linux驱动开发指南》关注官方微信号公众号,获取更多资料:正点原子第五十七章Linux MISC驱动实验misc的意思是混合、杂项的,因此MISC驱动也叫做杂项...
  • 正点原子MINI板子实现简易版万年历,LCD显示屏显示当前时间,可通过按键来修改时间,也可以设置多个闹钟提醒
  • 正点原子F4计算器.rar

    2020-03-15 17:06:04
    基于正点原子的stm32407的计算器,使用了enwin,需要用到触摸屏和显示屏,把计算机单独移植了出来
  • 1)资料下载:点击资料即可下载2)对正点原子Linux感兴趣的同学可以加群讨论:9354467413)关注正点原子公众号,获取最新资料更新第四十七章Linux并发与竞争 Linux是一个多任务操作系统,肯定会存在多个任务共同操作同...
  • 正点原子MINI stm32 PCB

    2020-05-15 16:17:42
    正点原子MINI STM32 pcb文件,闲鱼上买的,共享给大家,以供大家需要时参考一下。学习PCB布局的技巧等。
  • 根据淘宝正点原子STM32F103最小系统绘制
  • 一、板块简介:I.MX6U-ALPHA 开发板是由正点原子推出的,主要以NXP I.MX6UL/UL核心的Cortex-A7开发平台。板载高性能音频编解码芯片、六轴传感器、百兆网卡、光环境传感以及各种接口芯片,可以满足各种应用需求。同时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,732
精华内容 2,292
关键字:

正点原子