设计FPGA的过程举例

数字电路经过半个世纪,从分立元件到小规模集成电路、中等规模集成电路、大规模、超大规模,集成度越来越高,运算能力越来越强,功耗越来越低,人类已经将数字集成电路发展到接近摩尔定律极限。
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开发需要改变一个观念:逻辑可以实现一切。嵌入硬核恰恰说明一点:有些事还是别让逻辑来做!

去钻污生产经验
苹果官方回复旧 iPhone 为什么会变慢的问题
沃达丰与福特公司合作使用5G技术打造“未来工厂”
中国联通成功获批500亿债券将用于缓解5G投资压力
新能源汽车动力电池到底哪个更安全?
设计FPGA的过程举例
提高电路检测质量的一种方法
低功耗SRAM存储器IS62WV1288DALL的特征
常见的6种DC-DC升压电路设计
在美国份额不足3% 索尼回天无力?
高功率基模固体倍频激光器及其应用
日本政府拟设立新的基金,以援助下一代6G通信研发
全新炫彩屏+屏幕指纹解锁 华为畅享10S打造千元机屏幕新体验
德州仪器推出世界首创12位29-kHz RGB LED驱动器系列
公私钥的基本概念以及管理加密资产的方法介绍
MIT名誉校长预测:机器学习会成为被广泛使用的工具
如何来判断后期走势
200元内发烧级蓝牙耳机哪款音质最好
一汽弗迪新能源电池一期项目投产,采用比亚迪先进刀片电池技术
华为Mate10什么时候上市最新消息:华为Mate10、华为Mate11、华为P11一起大曝光!