數(shù)字電路經(jīng)過半個世紀(jì),從分立元件到小規(guī)模集成電路、中等規(guī)模集成電路、大規(guī)模、超大規(guī)模,集成度越來越高,運(yùn)算能力越來越強(qiáng),功耗越來越低,人類已經(jīng)將數(shù)字集成電路發(fā)展到接近摩爾定律極限。
FPGA是這樣一類數(shù)字電路,它可以反復(fù)修改自身邏輯功能,具有靈活多變的特性,設(shè)計(jì)FPGA的過程其實(shí)是遵循數(shù)字電路設(shè)計(jì)的一般流程的:
(1)需求分析
(2)抽象邏輯表示(真值表、狀態(tài)流圖)
(3)具體邏輯表示(HDL、布爾方程)
(4)將邏輯表示綜合為可實(shí)現(xiàn)的電路(門電路、LUT和觸發(fā)器)
(5)驗(yàn)證
FPGA邏輯工程師一般是從應(yīng)用需求出發(fā),用Verilog或VHDL來描述算法,并通過綜合實(shí)現(xiàn)工具、仿真工具、調(diào)試工具來協(xié)助完成設(shè)計(jì)。
針對Xilinx器件,開發(fā)工具為ISE(Project Navigator,ISim,iMact,Chipscope),有時需要用Modelsim工具完成HDL仿真。
Zynq內(nèi)部包含PL,資源前面已經(jīng)說過了,大量LUT,F(xiàn)F,DSP48E1等著你來組織,開發(fā)PL可以完全脫離PS,采用傳統(tǒng)開發(fā)工具ISE完成。
下面給出只利用PL實(shí)現(xiàn)流水燈的例子,希望能有拋磚引玉的功效。
上一節(jié)介紹了使用ARM控制流水燈的例子,這里完成同樣的功能,但用PL實(shí)現(xiàn)控制,將PS冷落一旁,不用理它。
首先運(yùn)行ISE Design Suite 14.5,打開Project Navigator軟件。
File-》New Project,新建一個工程,彈出對話框如下:
按照上圖進(jìn)行工程設(shè)置,然后點(diǎn)Next
設(shè)置器件為XC7Z020,即我們Zedboard上的主芯片型號。封裝為CLG484,速度級別為-1,語言選擇VHDL。點(diǎn)Next,F(xiàn)inish。
我們分析一下怎樣完成這個設(shè)計(jì)。數(shù)字電路都需要有時鐘源,我們的PL也不例外,板子上有專為PL提供時鐘輸入的晶振,在原理圖中找到:
可見晶振輸入為100MHz,直接送入Y9引腳(位于PL部分)。如此高的時鐘速率,需要經(jīng)過分頻,LED閃爍速率最好低于10Hz,這樣人眼才能分辨出來。
用ISE提供的IP核可以實(shí)現(xiàn)分頻,在工程中Add Source:
選擇IP(Core Generator),輸入名稱為clk_module,如上圖,點(diǎn)Next。
從“FPGA Features and Design”中“Clocking“下找到Clocking Wizard,點(diǎn)Next,F(xiàn)inish。進(jìn)入配置IP的環(huán)節(jié)。
第一步,默認(rèn)設(shè)置,Next。。。
第二步,將CLK_OUT1輸出頻率設(shè)置為5MHz(貌似不能再小了),其他不改,點(diǎn)Next。
第三步里把復(fù)位和鎖定引腳去掉,如下圖所示,后面都一路Next到結(jié)束。
這樣生成了第一個分頻器,輸入為100MHz,輸出為5MHz,需要進(jìn)一步分頻。
再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;
這里使用計(jì)數(shù)器實(shí)現(xiàn)了分頻,輸出為1Hz。
Add Source,選UCF,命名myled.ucf,內(nèi)容如下:
##
## 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;
源文件都已經(jīng)OK,接下來進(jìn)行綜合、實(shí)現(xiàn)、生成bit、iMPACT下載即可(按照標(biāo)準(zhǔn)FPGA開發(fā)流程),效果與前面的實(shí)驗(yàn)相同,略去不表。這里由于邏輯比較簡單,省去了功能仿真、時序仿真等流程。真正的邏輯開發(fā)最好經(jīng)過仿真后再下載到硬件中。
從上面這個例子發(fā)現(xiàn),不考慮ARM時,PL部分開發(fā)與普通的FPGA開發(fā)并沒有任何區(qū)別。
恰恰是由于ARM的存在,我們的PL可以實(shí)現(xiàn)更多復(fù)雜的功能!
1. DDR控制。采用邏輯來實(shí)現(xiàn)DDR2存儲器訪問非常復(fù)雜,調(diào)試也非常耗費(fèi)時間。ARM核的存在,使得PL可以借助ARM來做DDR2控制器,訪問時只需遵循PS與PL之間的通信協(xié)議——AXI就可以了。
2. 操作系統(tǒng)。同樣,F(xiàn)PGA上運(yùn)行操作系統(tǒng)是一件費(fèi)力不討好的事情,浪費(fèi)大量邏輯資源,如果用軟核實(shí)現(xiàn)CPU,性能又不高。如果有ARM硬核負(fù)責(zé)操作系統(tǒng)的日常維護(hù),必要時FPGA仍然通過AXI總線與ARM上的操作系統(tǒng)進(jìn)行交互。
3. 網(wǎng)絡(luò)。
4. USB通信
從傳統(tǒng)FPGA開發(fā)到Zynq上PL開發(fā)需要改變一個觀念:邏輯可以實(shí)現(xiàn)一切。嵌入硬核恰恰說明一點(diǎn):有些事還是別讓邏輯來做!
-
FPGA
+關(guān)注
關(guān)注
1640文章
21899瀏覽量
611394
發(fā)布評論請先 登錄
相關(guān)推薦
Verilog語言在FPGA中運(yùn)用的簡單實(shí)例有什么,求舉例?
FPGA大神幫你解決開發(fā)過程的問題
舉例說明FPGA作為協(xié)處理器在實(shí)時系統(tǒng)中有哪些應(yīng)用?
鎖相環(huán)設(shè)計(jì)舉例

簡化Xilinx和Altera FPGA調(diào)試過程
DSP和FPGA共用FLASH進(jìn)行配置的方法
FPGA選型和設(shè)計(jì)過程
FPGA設(shè)計(jì)過程中常用的FIFO
FPGA的編譯過程討論

評論