ZED-Board从入门到精通(四):从传统FPGA开发到PL开发的转变

数字电路经过半个世纪,从分立元件到小规模集成电路、中等规模集成电路、大规模、超大规模,集成度越来越高,运算能力越来越强,功耗越来越低,人类已经将数字集成电路发展到接近摩尔定律极限。

FPGA是这样一类数字电路,它可以反复修改自身逻辑功能,具有灵活多变的特性,设计FPGA的过程其实是遵循数字电路设计的一般流程的:

(1)需求分析

(2)抽象逻辑表示(真值表、状态流图)

(3)具体逻辑表示(HDL、布尔方程)

(4)将逻辑表示综合为可实现的电路(门电路、LUT和触发器)

(5)验证

 

FPGA逻辑工程师一般是从应用需求出发,用Verilog或VHDL来描述算法,并通过综合实现工具、仿真工具、调试工具来协助完成设计。

针对Xilinx器件,开发工具为ISE(Project Navigator,ISim,iMact,Chipscope),有时需要用Modelsim工具完成HDL仿真。

 

Zynq内部包含PL,资源前面已经说过了,大量LUT,FF,DSP48E1等着你来组织,开发PL可以完全脱离PS,采用传统开发工具ISE完成。

下面给出只利用PL实现流水灯的例子,希望能有抛砖引玉的功效。

上一节介绍了使用ARM控制流水灯的例子,这里完成同样的功能,但用PL实现控制,将PS冷落一旁,不用理它。

首先运行ISE Design Suite 14.5,打开Project Navigator软件。

File->New Project,新建一个工程,弹出对话框如下:

按照上图进行工程设置,然后点Next

 

 

设置器件为XC7Z020,即我们Zedboard上的主芯片型号。封装为CLG484,速度级别为-1,语言选择VHDL。点Next,Finish。

我们分析一下怎样完成这个设计。数字电路都需要有时钟源,我们的PL也不例外,板子上有专为PL提供时钟输入的晶振,在原理图中找到:

可见晶振输入为100MHz,直接送入Y9引脚(位于PL部分)。如此高的时钟速率,需要经过分频,LED闪烁速率最好低于10Hz,这样人眼才能分辨出来。

用ISE提供的IP核可以实现分频,在工程中Add Source:

选择IP(Core Generator),输入名称为clk_module,如上图,点Next。

 

 

从“FPGA Features and Design”中"Clocking“下找到Clocking Wizard,点Next,Finish。进入配置IP的环节。

 

 

第一步,默认设置,Next。。。

 

 

 

第二步,将CLK_OUT1输出频率设置为5MHz(貌似不能再小了),其他不改,点Next。

第三步里把复位和锁定引脚去掉,如下图所示,后面都一路Next到结束。

 

这样生成了第一个分频器,输入为100MHz,输出为5MHz,需要进一步分频。

 

再New Source一下,选VHDL模块,命名为myled.vhd,输入代码如下:

----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date:    20:59:03 08/16/2013
-- Design Name:
-- Module Name:    myled - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity myled is
    Port ( clk : in  STD_LOGIC;
			  rst : in  STD_LOGIC;
           led : out  STD_LOGIC_VECTOR(7 downto 0));
end myled;

architecture Behavioral of myled is
signal clk_5M : STD_LOGIC;
signal localbuffer :STD_LOGIC_VECTOR(7 downto 0);

component clk_module
port
 (-- Clock in ports
  CLK_IN1           : in     std_logic;
  -- Clock out ports
  CLK_OUT1          : out    std_logic
 );
end component;
begin

myclk : clk_module
  port map
   (-- Clock in ports
    CLK_IN1 => clk,
    -- Clock out ports
    CLK_OUT1 => clk_5M);
	process(clk_5M,rst)
	variable cnt : integer := 0;
	begin
		led <= localbuffer;
		if(rst = '1') then
			localbuffer <= X"01";
		elsif(clk_5M'EVENT and clk_5M = '1')
		then
			cnt := cnt + 1;
			if (cnt = 5000000)
			then
				localbuffer <= localbuffer(6 downto 0)&localbuffer(7);
				cnt := 0;
			end if;
		end if;
	end process;

end Behavioral;

 

这里使用计数器实现了分频,输出为1Hz。

 

Add Source,选UCF,命名myled.ucf,内容如下:

 

##
##  This is an updated UCF file from the original version by Digilink.
##  The CS signal has been removed and all the other signals are mapped to
##  proper pin on the Zynq FPGA.
##  For the reset, the middle-push button is used.
##  Modified by Farhad Abdolian (fabdolian@seemaconsulting.com) Nov. 5, 2012
##

Net "clk" LOC=Y9 | IOSTANDARD=LVCMOS33;
Net "clk" TNM_NET = sys_clk_pin;
TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 100000 kHz;

NET "led[0]" LOC = T22;
NET "led[1]" LOC = T21;
NET "led[2]" LOC = U22;
NET "led[3]" LOC = U21;
NET "led[4]" LOC = V22;
NET "led[5]" LOC = W22;
NET "led[6]" LOC = U19;
NET "led[7]" LOC = U14;
NET "led[7]" IOSTANDARD = LVCMOS33;
NET "led[6]" IOSTANDARD = LVCMOS33;
NET "led[5]" IOSTANDARD = LVCMOS33;
NET "led[4]" IOSTANDARD = LVCMOS33;
NET "led[3]" IOSTANDARD = LVCMOS33;
NET "led[2]" IOSTANDARD = LVCMOS33;
NET "led[1]" IOSTANDARD = LVCMOS33;
NET "led[0]" IOSTANDARD = LVCMOS33;

#We use the center push button as the reset for this project
Net "rst" LOC = P16 | IOSTANDARD = LVCMOS33;

源文件都已经OK,接下来进行综合、实现、生成bit、iMPACT下载即可(按照标准FPGA开发流程),效果与前面的实验相同,略去不表。这里由于逻辑比较简单,省去了功能仿真、时序仿真等流程。真正的逻辑开发最好经过仿真后再下载到硬件中。

 

从上面这个例子发现,不考虑ARM时,PL部分开发与普通的FPGA开发并没有任何区别。

 

恰恰是由于ARM的存在,我们的PL可以实现更多复杂的功能!

 

1. DDR控制。采用逻辑来实现DDR2存储器访问非常复杂,调试也非常耗费时间。ARM核的存在,使得PL可以借助ARM来做DDR2控制器,访问时只需遵循PS与PL之间的通信协议——AXI就可以了。

2. 操作系统。同样,FPGA上运行操作系统是一件费力不讨好的事情,浪费大量逻辑资源,如果用软核实现CPU,性能又不高。如果有ARM硬核负责操作系统的日常维护,必要时FPGA仍然通过AXI总线与ARM上的操作系统进行交互。

3. 网络。

4. USB通信

 

从传统FPGA开发到Zynq上PL开发需要改变一个观念:逻辑可以实现一切。嵌入硬核恰恰说明一点:有些事还是别让逻辑来做!

时间: 2024-08-03 14:20:15

ZED-Board从入门到精通(四):从传统FPGA开发到PL开发的转变的相关文章

ZED Board从入门到精通(三):从传统ARM开发到PS开发的转变

ARM已经在国内流行得一塌糊涂,各类教程.开发板(S3C2440,6410)层出不穷,归结下来,传统ARM开发包括以下几个步骤: (1)硬件电路板设计(对于Zedboard,相当于设计逻辑电路,PL工程师负责): (2)基本模块裸机代码测试(UART,DDR2,其他外设): (3)移植操作系统(如Linux,uCLinux,uCOS等): (4)编写相应操作系统的驱动程序(可从(2)中移植过来): (5)编写应用程序(或移植已有的应用程序).界面设计(Qt): 一个有ARM开发经验的工程师,接触

ZED Board从入门到精通(二):AXI简介

距离上次发帖时间有点长了,其实这段时间一直在思考. 市面上已经有专门讲ZYNQ的书籍了,我看过的有这两本. 这两本书怎么说呢,我觉得第二本更像是官方文档的堆砌吧(不喜勿喷),洋洋洒洒近600页,真正我想看的内容却少之又少.第一本书更适合入门(其实相当于傻瓜教程,你拿到书,拿到板子之后马上就能开始做实验),但语法错误.名词错误.软件版本不同造成的错误有很多,附加的光盘第一个实验内容就有错!有时辛辛苦苦搭建起来的环境,因为书上有错造成实验失败是很痛苦的,浪费感情. 建议先读一读第一本,对ZYNQ建立

ZED Board从入门到精通(一):ZYNQ结构简介

ZYNQ-7000是第一代可扩展处理平台(Extensible Processing Platform,EPP),同时具有软件可编程.硬件可编程.IO可编程的特性,为此Xilinx强调了"All Programmable的"概念.下面对其做一简要介绍,便于读者建立初步框架. ZYNQ芯片内包含一个丰富特性的基于双核ARM Cortex-A9的处理子系统(Processing System,PS)和Xilinx 28nm可编程逻辑(Programmable Logic,PL).PS除了核

ZED Board从入门到精通系列(八)——Vivado HLS实现矩阵相乘

终于到了HLS部分.HLS是High Level Synthesis的缩写,是一种可以将高级程序设计语言C,C++,SystemC综合为RTL代码的工具.   生产力的发展推动了设计模式.在电子技术初级阶段,人们关注的是RLC电路,通过建立微分方程求解电路响应.门级电路是对RLC的初步封装,人们进而采用布尔代数.卡诺图进行电路设计与分析.之后随着集成电路进一步发展,门电路可以集成为寄存器.触发器.ROM等宏单元,设计工具也变得更为高度模块化.算法级别的电路设计,则一直没有特别好的工具,直到出现了

ZED Board从入门到精通系列(七)——Vivado+SDK实现MP3播放

本文将给出通过Vivado IDE开发Zynq平台上PS裸机应用程序的流程.通过与本系列博客(三)对比,读者将看到Vivado开发更高效.快捷.   MP3我们都听过,现在我们可以用ZED-Board来听.板子上有音频芯片ADAU1761,可以实现录音.放音,但不具有MP3解码功能.Zynq 双核ARM9做MP3软件解码应该是可以实现的,但是博主本人有一颗VS1003,可以实现MP3硬件解码,软件将得以简化,对MP3解码原理感兴趣的可以深入研究如何利用CortexA9+ADAU1761实现MP3

《51单片机应用开发从入门到精通》——1.3 Keil uVision2集成开发环境

1.3 Keil uVision2集成开发环境 51单片机应用开发从入门到精通 uVision2 IDE是Keil software公司的产品,它集项目管理.编译工具.代码编写工具.代码调试以及完全仿真于一体,特别适用于个人开发或者人数少.对开发过程的管理还不成熟的开发团体.这一功能强大的软件提供简单易用的开发平台,可以让开发者在开发过程中集中精力于项目本身,加快开发速度. 1.3.1 uVision2介绍 uVision2的界面窗口如图1-13所示,该软件提供了丰富的工具,常用命令都具有快捷工

《C语言开发从入门到精通》一第2章 C语言开发工具详解2.1 用DOS开发C程序

第2章 C语言开发工具详解 C语言开发从入门到精通 古人云:工欲善其事,必先利其器.由第1章的内容我们了解到,C语言开发工作需要使用专门的开发工具,这样才能起到事半功倍的效果.在本章的内容中,将简要介绍常用的几种C语言开发工具,详细介绍它们的安装和使用方法,为读者步入本书后面知识的学习打下基础. 本章内容 用DOS开发C程序 在Windows环境下开发C程序 在Linux下开发C程序 技术解惑 安装Visual Studio 2010的几个常见问题 有没有轻量级的.可以复制和粘贴代码的工具 Wi

Python基本语法[二],python入门到精通[四] (转)

写在前面 python你不去认识它,可能没什么,一旦你认识了它,你就会爱上它 回到顶部 v正文开始:Python基本语法 1.定义常量: 之所以上篇博客介绍了定义变量没有一起介绍定义常量,是因为Python的常量相对其他语言,可能略显麻烦.不仅仅只是单靠const就可以完成常量定义的.在Python中定义常量需要用对象的方法来创建. 我们需要在Lib的目录下创建一个const.py的文件,lib目录下主要是放一些模块的东西 代码正文: class _const(object): class Co

《libGDX移动游戏开发从入门到精通》一1.2 搭建libGDX开发环境

1.2 搭建libGDX开发环境 在本节中,我们将介绍搭建libGDX的开发环境.本节是大家使用libGDX进行游戏开发的基本准备工作.需要注意的是,在此之前应该把JDK下载.安装并配置好.同样的,eclipse下的开发环境也需要配置好. 1.2.1 libGDX下载 (1)登录官网:http://libgdx.badlogicgames.com/,单击红色框选中的"Download",如图1.6所示. (2)单击"Download"选项后你会看到以下界面,单击其中