數字電路經過半個世紀,從分立元件到小規模集成電路、中等規模集成電路、大規模、超大規模,集成度越來越高,運算能力越來越強,功耗越來越低,人類已經將數字集成電路發展到接近摩爾定律極限。
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 ([email protected]) 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開發需要改變一個觀念:邏輯可以實現一切。嵌入硬核恰恰說明一點:有些事還是別讓邏輯來做!
-
FPGA
+關注
關注
1640文章
21907瀏覽量
611559
發布評論請先 登錄
相關推薦
FPGA大神幫你解決開發過程的問題
鎖相環設計舉例

評論