HPS基本概念及其設計

  DE1-SOC開發版上的FPGA在一個基於ARM的用戶定製系統(SOC)中集成了分立處理器(HPS)、FPGA和數字信號處理(DSP)功能。HPS是基於ARM cortex-A9雙核處理器,具備豐富的外設和存儲接口(DDR2/3)等。 HPS 和 FPGA 不只可以獨立工做,也能經過高性 能 AXI 總線橋接實現高速寬帶行數據通訊,這個總線是雙向的,HPS 總線主機可以經過 HPS 至 FPGA 橋接訪問 FPGA 架構中的總線及其外設。全部橋接兼容 AXI-3/4, 支持同時讀寫操做,一樣的,FPGA 架構中的總線主機可以經過 FPGA 至 HPS 橋接訪問 HPS 總線及其外設。基本架構以下:html

 

 一、本文學習目的

  • 創建一個 SoC based FPGA hardware 系統 
  • HPS 組件在 Qsys 內的設定(based on DE1-SoC board) 
  • FPGA avmm 外設和 HPS 橋接 
  • 生成 Preloader 和 Device Tree(based on DE1-SoC board) 
  • 編譯 linux 應用程序  Linux 下控制 HPS 的外設 
  • HPS 總線到 FPGA 總線的 Address Mapping 
  • HPS 控制 FPGA 端的 LED(based on DE1-SoC board) 

二、基本設計流程

SoC FPGA 設計流程 基於 SoC 的 FPGA 嵌入式系統硬件與軟件的開發流程如圖所示。linux

  首先要基於 Qsys 規劃系統須要的外設,包括 HPS 與 FPGA 各自的接口。HPS 外設只須要根據 DE1-SoC 硬 件屬性進行設定便可,FPGA 外設依舊是經過 IP 模塊的方式添加。而後創建各個模塊間 的鏈接(時鐘,復位,總線),最後產生出硬件與軟件開發各自所需的檔案ios

  • 硬件開發和以往傳統的基於 NiosII 的 FPGA 設計流程相同,使用 Quartus 加入 Qsys 以 及用戶邏輯,而後設定 FPGA 管腳分配,最後綜合編譯產生 .sof 編程檔案。
  • 軟件的開發則經過 Altera 的 SoCEDS 開發工具將 Qsys 所作的 HPS 硬件設定轉換成產生 Preloader、uboot 和 Device Tree 所需的輸入文件。這些文件能夠協助 HPS 在 DE1-SoC 上運行 embedded linux system,linux 內核解析須要掛載硬件外設並完成 boot。而後 開發基於 linux 操做系統的應用程序並在 DE1-SoC 上運行。應用程序能夠實現 HPS 和 FPGA 協同工做完成定製化設計。

三、boot sd card製做流程

   通常從系統設計開始到生成boot linux操做系統SD Card,其所須要的軟件工具與生成檔案以下:web

下圖說明了GSRD的完整構建流程。編程

GSRD-flow.png

下表顯示了構建流程中使用的工具:服務器

工具 描述 部分
Quartus II 建立,編輯和編譯FPGA硬件設計 ACDS
設備樹生成器 生成設備樹 SoC EDS
設備樹編譯器 在設備樹文件格式之間轉換
預加載器生成器 根據硬件切換信息生成Preloader源代碼
ARM DS-5 AE 軟件開發套件
BitBake的 Yocto創建實用程序 Yocto源包
SD卡腳本 建立SD卡圖像的腳本

 

下表顯示了構建過程當中的輸入文件:架構

文件 描述
Quartus項目 FPGA硬件項目源代碼
Board XML文件 描述開發板的文件,用於建立設備樹
Yocto食譜 用於構建Linux可交付成果的Yocto配方
Web服務器文件 在板上運行的Web服務器所需的其餘文件

 

下表描述了構建流程圖中的其他項目:app

文件 描述
.sof SRAM目標文件 - FPGA編程文件,由編譯FPGA硬件項目產生
.rbf 原始二進制文件 - 壓縮FPGA編程文件
.dts 設備樹源 - 用於描述Linux內核的硬件
.dtb 設備樹二進制 - .dts的二進制表示
.sopcinfo SOPC信息文件 - 包含設備樹生成器要使用的硬件的描述
.svd 系統視圖描述文件 - 描述DS-5調試器的硬件
不可觸摸 包含Preloader Generator要使用的硬件描述的文件夾

 

四、搭建Qsys系統

  下面開啓Qsys工程,瞭解HPS的組件設定。ide

 一、建立Qsys工程

   Qsys工程的建立過程不是這裏的重點,瞭解建立過程能夠參考文章完整的SOPC開發流程體驗,這裏直接打開官方培訓給的工程(提取碼dhgv,不要放到中文路徑下)工具

  進入de1_soc_training\de1_soc_training\lab\HW\DE1_SoC_GHRD,雙擊soc_system.qpf打開工程

  點擊Qsys打開Qsys工具,打開.qsys系統,能夠看到裏面已經包含了HPS等組件

二、配置HPS系統

  HPS內包含了雙核的ARM Cortex A9處理器外,還由許多內建外設可使用。

  下面對其進行配置,點擊hpc_0打開HPS配置窗口,能夠看到以下配置界面,HPS屬性有FPGA Interfaces、PeripheralPin Multiplexing、HPS Clock和SDRAM四個配置欄。

   在FPGA Interfaces選項欄下,在general下的選項是配置使能基本的接口和信號,配置AXI Bridges參數

  AXI Bridges能夠配置3個AXI Bridges的數據寬度

   FPGA to HPS SDRAM Interface下能夠增減FPGA to HPS SDRAM的接口數目

   Resets能夠配置系統的Reset信號

  DMA Peripheral Request使能以及中斷使能

  HPS-to-FPGA使能外圍設備。

 在Peripheral Pin Multiplexing選項欄下,能夠經過選項來啓動HPS的外圍設備。

  能夠看到每個外設都有一個pin選項,這是由於HPS I/O若是對照DE1-SOC的原理圖,能夠發現HPS的管腳是複用的,這個就須要對照着原理圖進行配置。能夠參照友晶DE-SOC開發板的user manual

   在這個設定頁最底下也提供了Peripherals Mux Table,能夠幫助用戶檢驗整個HPS外設I/O pin multiplexing設定的狀態,看看是否有衝突。表內,若管腳名被標註爲粗體,就表明此管腳一杯設定。

 在HPS Clocks選項卡,能夠設置使能 HPS to FPGA和FPGA to HPS之間的時鐘及其頻率.17.0軟件中Cyclone V 器件MPU 默認時鐘爲925Mhz,而13.1版爲800M。這裏編譯不改變MPU的Clock,因此去掉use default MPU clock frequency選項!不用改其餘的選項,Clock即爲800MHz。從新generate 關閉就行了。使用Quarut編譯編譯完成後會有hps_isw_handoff中的文件會更新,這些文件時鏈接HPS硬件配置與preloaderr軟 件接口文件。

 

 在SDRAM選項卡里,你能夠配置HPS的外部存儲器接口參數。

 

   這裏只作簡單介紹採用默認配置,實際工程中根據需求進行配置。

三、添加並配置組件

  接下來,就是根據需求在Qsys里加入組件並與HPS鏈接。這裏用LED進行舉例。

一、組件添加與配置

   首先添加LED PIO component,在IP catalog中搜索PIO,選中PIO,雙擊添加組件

  添加過程須要對組件進行配置,由於是10個LED,因此配置以下:

  點擊finish後,在Qsys裏就能夠看到添加的組件。此時還有報錯,這是應爲沒進行鏈接。

二、組件重命名

   爲了便於區分不一樣IO的做用,此處須要對組件重命名,選中PIO->右鍵->選擇rename(或者選中CTRL+R)

  而後,雙擊extern_connection的Export欄,引出LED的外部線,將其重命名爲led_pio_external_connection

同理添加四個input按鍵

三、組件連線

將組件按以下方式連線

能夠經過以下方法鏈接,,右鍵led_pio組件下的clk信號,選擇要來鏈接的信號,依次相連便可。

 其中須要注意的是在button_pio中,由於是輸入,會有中斷優先極設置,其連線以下

設置優先等級,選擇IRQ列,分配IRQ優先級,這裏設爲1

四、基地址設置

  將led_pio的基地址修改成0x01_0040,將button_pio 的基地址基地址修改成0x01_00C0地址分配參照下圖。

關於地址還有一個須要理解的(來自WS_2_Linux_Kernel_Introduction_Workshop):

 

並點擊鎖定圖標鎖定基地址,如圖所示

至此,整個組件已經添加完畢,完整系統鏈接如圖所示。

點擊generate hdl進行編譯保存便可。

四、搭建Qsys系統

當 Qsys 生成完後,會產生出許多能夠被 Quartus II 編譯合成的 HDL(verilog) 文檔,通常位於以qsys文件名命名的文件夾內。這些文件須要先被增添入Quartus II 工程內。咱們能夠經過增長 .qip 這個描述全部文件位置的目錄檔案完成全部 include 文檔的包含。

 如圖所示在 Quartus II 下選擇 Assignments => Settings

  而後在(<你的路徑>\de1_soc_training\de1_soc_training\lab\HW\DE1_SoC_GHRD\soc_system\synthesis)添加.qip文件

 

使用一樣的方法,將文件夾(<你的路徑>\de1_soc_training\de1_soc_training\lab\HW\DE1_SoC_GHRD)下的時序約束文件soc_system_timing.sdc加入到項目中

 

 

 點擊apply後,回到quartus ii界面,在project Navigator中,雙擊ghrd_top

能夠開ghrd_top.v文件,找到soc_system u0,在期內加入led_pio和button_pio對應的instance輸入LED以及Button的外部接口聲明信號。

.led_pio_external_connection_export (LEDR),
.button_pio_external_connection_export (KEY),

 加入後的程序以下:

// Copyright (c) 2013 by Terasic Technologies Inc.
// ============================================================================
//
// Permission:
//
//   Terasic grants permission to use and modify this code for use
//   in synthesis for all Terasic Development Boards and Altera Development 
//   Kits made by Terasic.  Other use of this code, including the selling 
//   ,duplication, or modification of any portion is strictly prohibited.
//
// Disclaimer:
//
//   This VHDL/Verilog or C/C++ source code is intended as a design reference
//   which illustrates how these types of functions can be implemented.
//   It is the user's responsibility to verify their design for
//   consistency and functionality through the use of formal
//   verification methods.  Terasic provides no warranty regarding the use 
//   or functionality of this code.
//
// ============================================================================
//           
//  Terasic Technologies Inc
//  9F., No.176, Sec.2, Gongdao 5th Rd, East Dist, Hsinchu City, 30070. Taiwan
//  
//  
//                     web: http://www.terasic.com/  
//                     email: support@terasic.com
//
// ============================================================================
//Date:  Mon Jun 17 20:35:29 2013
// ============================================================================

`define ENABLE_HPS
//`define ENABLE_USB

module ghrd_top(

      ///////// ADC /////////
      output             ADC_CS_n,
      output             ADC_DIN,
      input              ADC_DOUT,
      output             ADC_SCLK,

      ///////// AUD /////////
      input              AUD_ADCDAT,
      inout              AUD_ADCLRCK,
      inout              AUD_BCLK,
      output             AUD_DACDAT,
      inout              AUD_DACLRCK,
      output             AUD_XCK,

      ///////// CLOCK2 /////////
      input              CLOCK2_50,

      ///////// CLOCK3 /////////
      input              CLOCK3_50,

      ///////// CLOCK4 /////////
      input              CLOCK4_50,

      ///////// CLOCK /////////
      input              CLOCK_50,

      ///////// DRAM /////////
      output      [12:0] DRAM_ADDR,
      output      [1:0]  DRAM_BA,
      output             DRAM_CAS_n,
      output             DRAM_CKE,
      output             DRAM_CLK,
      output             DRAM_CS_N,
      inout       [15:0] DRAM_DQ,
      output             DRAM_LDQM,
      output             DRAM_RAS_N,
      output             DRAM_UDQM,
      output             DRAM_WE_N,

      ///////// FAN /////////
      output             FAN_CTRL,

      ///////// FPGA /////////
      output             FPGA_I2C_SCLK,
      inout              FPGA_I2C_SDAT,

      ///////// GPIO /////////
      inout       [35:0] GPIO_A,
      inout       [35:0] GPIO_B,

      ///////// HEX0 /////////
      output      [6:0]  HEX0,

      ///////// HEX1 /////////
      output      [6:0]  HEX1,

      ///////// HEX2 /////////
      output      [6:0]  HEX2,

      ///////// HEX3 /////////
      output      [6:0]  HEX3,

      ///////// HEX4 /////////
      output      [6:0]  HEX4,

      ///////// HEX5 /////////
      output      [6:0]  HEX5,

`ifdef ENABLE_HPS
      ///////// HPS /////////
//      input              HPS_CLOCK1_25,
//      input              HPS_CLOCK2_25,
      inout              HPS_CONV_USB_N,
      output      [14:0] HPS_DDR3_ADDR,
      output      [2:0]  HPS_DDR3_BA,
      output             HPS_DDR3_CAS_N,
      output             HPS_DDR3_CKE,
      output             HPS_DDR3_CK_N,
      output             HPS_DDR3_CK_P,
      output             HPS_DDR3_CS_N,
      output      [3:0]  HPS_DDR3_DM,
      inout       [31:0] HPS_DDR3_DQ,
      inout       [3:0]  HPS_DDR3_DQS_N,
      inout       [3:0]  HPS_DDR3_DQS_P,
      output             HPS_DDR3_ODT,
      output             HPS_DDR3_RAS_N,
      output             HPS_DDR3_RESET_N,
      input              HPS_DDR3_RZQ,
      output             HPS_DDR3_WE_N,
      output             HPS_ENET_GTX_CLK,
      inout              HPS_ENET_INT_N,
      output             HPS_ENET_MDC,
      inout              HPS_ENET_MDIO,
      input              HPS_ENET_RX_CLK,
      input       [3:0]  HPS_ENET_RX_DATA,
      input              HPS_ENET_RX_DV,
      output      [3:0]  HPS_ENET_TX_DATA,
      output             HPS_ENET_TX_EN,
      inout       [3:0]  HPS_FLASH_DATA,
      output             HPS_FLASH_DCLK,
      output             HPS_FLASH_NCSO,
      inout       [1:0]  HPS_GPIO,
      inout              HPS_GSENSOR_INT,
      inout              HPS_I2C1_SCLK,
      inout              HPS_I2C1_SDAT,
      inout              HPS_I2C2_SCLK,
      inout              HPS_I2C2_SDAT,
      inout              HPS_I2C_CONTROL,
      inout              HPS_KEY,
      inout              HPS_LED,
//      input              HPS_RESET_N,
      output             HPS_SD_CLK,
      inout              HPS_SD_CMD,
      inout       [3:0]  HPS_SD_DATA,
      output             HPS_SPIM_CLK,
      input              HPS_SPIM_MISO,
      output             HPS_SPIM_MOSI,
      inout              HPS_SPIM_SS,
      input              HPS_UART_RX,
      output             HPS_UART_TX,
      input              HPS_USB_CLKOUT,
      inout       [7:0]  HPS_USB_DATA,
      input              HPS_USB_DIR,
      input              HPS_USB_NXT,
      output             HPS_USB_STP,
//      output             HPS_WARM_RST_N,
`endif /*ENABLE_HPS*/

      ///////// IRDA /////////
      input              IRDA_RXD,
      output             IRDA_TXD,

      ///////// KEY /////////
      input       [3:0]  KEY,

      ///////// LEDR /////////
      output      [9:0]  LEDR,

      ///////// PS2 /////////
      inout              PS2_CLK,
      inout              PS2_CLK2,
      inout              PS2_DAT,
      inout              PS2_DAT2,

      ///////// SW /////////
      input       [9:0]  SW,

      ///////// TD /////////
      inout              TD_CLK27,
      output      [7:0]  TD_DATA,
      output             TD_HS,
      output             TD_RESET_N,
      output             TD_VS,

`ifdef ENABLE_USB
      ///////// USB /////////
      input              USB_B2_CLK,
      inout       [7:0]  USB_B2_DATA,
      output             USB_EMPTY,
      output             USB_FULL,
      input              USB_OE_N,
      input              USB_RD_N,
      input              USB_RESET_N,
      inout              USB_SCL,
      inout              USB_SDA,
      input              USB_WR_N,
`endif /*ENABLE_USB*/

      ///////// VGA /////////
      output             VGA_BLANK_N,
      output      [7:0]  VGA_B,
      output             VGA_CLK,
      output      [7:0]  VGA_G,
      output             VGA_HS,
      output      [7:0]  VGA_R,
      output             VGA_SYNC_N,
      output             VGA_VS
);

//=======================================================
//  REG/WIRE declarations
//=======================================================
wire  hps_fpga_reset_n;

//=======================================================
//  Structural coding
//=======================================================
soc_system u0 (      
		  .clk_clk                               (CLOCK_50),                             //                clk.clk
		  .reset_reset_n                         (1'b1),                                 //                reset.reset_n
		  .led_pio_external_connection_export (LEDR),
		  .button_pio_external_connection_export (KEY),
		
	
	//HPS ddr3
		  .memory_mem_a                          ( HPS_DDR3_ADDR),                       //                memory.mem_a
        .memory_mem_ba                         ( HPS_DDR3_BA),                         //                .mem_ba
        .memory_mem_ck                         ( HPS_DDR3_CK_P),                       //                .mem_ck
        .memory_mem_ck_n                       ( HPS_DDR3_CK_N),                       //                .mem_ck_n
        .memory_mem_cke                        ( HPS_DDR3_CKE),                        //                .mem_cke
        .memory_mem_cs_n                       ( HPS_DDR3_CS_N),                       //                .mem_cs_n
        .memory_mem_ras_n                      ( HPS_DDR3_RAS_N),                      //                .mem_ras_n
        .memory_mem_cas_n                      ( HPS_DDR3_CAS_N),                      //                .mem_cas_n
        .memory_mem_we_n                       ( HPS_DDR3_WE_N),                       //                .mem_we_n
        .memory_mem_reset_n                    ( HPS_DDR3_RESET_N),                    //                .mem_reset_n
        .memory_mem_dq                         ( HPS_DDR3_DQ),                         //                .mem_dq
        .memory_mem_dqs                        ( HPS_DDR3_DQS_P),                      //                .mem_dqs
        .memory_mem_dqs_n                      ( HPS_DDR3_DQS_N),                      //                .mem_dqs_n
        .memory_mem_odt                        ( HPS_DDR3_ODT),                        //                .mem_odt
        .memory_mem_dm                         ( HPS_DDR3_DM),                         //                .mem_dm
        .memory_oct_rzqin                      ( HPS_DDR3_RZQ),                        //                .oct_rzqin
       //HPS ethernet		
	     .hps_0_hps_io_hps_io_emac1_inst_TX_CLK ( HPS_ENET_GTX_CLK),       //                             hps_0_hps_io.hps_io_emac1_inst_TX_CLK
        .hps_0_hps_io_hps_io_emac1_inst_TXD0   ( HPS_ENET_TX_DATA[0] ),   //                             .hps_io_emac1_inst_TXD0
        .hps_0_hps_io_hps_io_emac1_inst_TXD1   ( HPS_ENET_TX_DATA[1] ),   //                             .hps_io_emac1_inst_TXD1
        .hps_0_hps_io_hps_io_emac1_inst_TXD2   ( HPS_ENET_TX_DATA[2] ),   //                             .hps_io_emac1_inst_TXD2
        .hps_0_hps_io_hps_io_emac1_inst_TXD3   ( HPS_ENET_TX_DATA[3] ),   //                             .hps_io_emac1_inst_TXD3
        .hps_0_hps_io_hps_io_emac1_inst_RXD0   ( HPS_ENET_RX_DATA[0] ),   //                             .hps_io_emac1_inst_RXD0
        .hps_0_hps_io_hps_io_emac1_inst_MDIO   ( HPS_ENET_MDIO ),         //                             .hps_io_emac1_inst_MDIO
        .hps_0_hps_io_hps_io_emac1_inst_MDC    ( HPS_ENET_MDC  ),         //                             .hps_io_emac1_inst_MDC
        .hps_0_hps_io_hps_io_emac1_inst_RX_CTL ( HPS_ENET_RX_DV),         //                             .hps_io_emac1_inst_RX_CTL
        .hps_0_hps_io_hps_io_emac1_inst_TX_CTL ( HPS_ENET_TX_EN),         //                             .hps_io_emac1_inst_TX_CTL
        .hps_0_hps_io_hps_io_emac1_inst_RX_CLK ( HPS_ENET_RX_CLK),        //                             .hps_io_emac1_inst_RX_CLK
        .hps_0_hps_io_hps_io_emac1_inst_RXD1   ( HPS_ENET_RX_DATA[1] ),   //                             .hps_io_emac1_inst_RXD1
        .hps_0_hps_io_hps_io_emac1_inst_RXD2   ( HPS_ENET_RX_DATA[2] ),   //                             .hps_io_emac1_inst_RXD2
        .hps_0_hps_io_hps_io_emac1_inst_RXD3   ( HPS_ENET_RX_DATA[3] ),   //                             .hps_io_emac1_inst_RXD3
       //HPS QSPI  
		  .hps_0_hps_io_hps_io_qspi_inst_IO0     ( HPS_FLASH_DATA[0]    ),     //                               .hps_io_qspi_inst_IO0
        .hps_0_hps_io_hps_io_qspi_inst_IO1     ( HPS_FLASH_DATA[1]    ),     //                               .hps_io_qspi_inst_IO1
        .hps_0_hps_io_hps_io_qspi_inst_IO2     ( HPS_FLASH_DATA[2]    ),     //                               .hps_io_qspi_inst_IO2
        .hps_0_hps_io_hps_io_qspi_inst_IO3     ( HPS_FLASH_DATA[3]    ),     //                               .hps_io_qspi_inst_IO3
        .hps_0_hps_io_hps_io_qspi_inst_SS0     ( HPS_FLASH_NCSO    ),        //                               .hps_io_qspi_inst_SS0
        .hps_0_hps_io_hps_io_qspi_inst_CLK     ( HPS_FLASH_DCLK    ),        //                               .hps_io_qspi_inst_CLK
       //HPS SD card 
		  .hps_0_hps_io_hps_io_sdio_inst_CMD     ( HPS_SD_CMD    ),           //                               .hps_io_sdio_inst_CMD
        .hps_0_hps_io_hps_io_sdio_inst_D0      ( HPS_SD_DATA[0]     ),      //                               .hps_io_sdio_inst_D0
        .hps_0_hps_io_hps_io_sdio_inst_D1      ( HPS_SD_DATA[1]     ),      //                               .hps_io_sdio_inst_D1
        .hps_0_hps_io_hps_io_sdio_inst_CLK     ( HPS_SD_CLK   ),            //                               .hps_io_sdio_inst_CLK
        .hps_0_hps_io_hps_io_sdio_inst_D2      ( HPS_SD_DATA[2]     ),      //                               .hps_io_sdio_inst_D2
        .hps_0_hps_io_hps_io_sdio_inst_D3      ( HPS_SD_DATA[3]     ),      //                               .hps_io_sdio_inst_D3
       //HPS USB 		  
		  .hps_0_hps_io_hps_io_usb1_inst_D0      ( HPS_USB_DATA[0]    ),      //                               .hps_io_usb1_inst_D0
        .hps_0_hps_io_hps_io_usb1_inst_D1      ( HPS_USB_DATA[1]    ),      //                               .hps_io_usb1_inst_D1
        .hps_0_hps_io_hps_io_usb1_inst_D2      ( HPS_USB_DATA[2]    ),      //                               .hps_io_usb1_inst_D2
        .hps_0_hps_io_hps_io_usb1_inst_D3      ( HPS_USB_DATA[3]    ),      //                               .hps_io_usb1_inst_D3
        .hps_0_hps_io_hps_io_usb1_inst_D4      ( HPS_USB_DATA[4]    ),      //                               .hps_io_usb1_inst_D4
        .hps_0_hps_io_hps_io_usb1_inst_D5      ( HPS_USB_DATA[5]    ),      //                               .hps_io_usb1_inst_D5
        .hps_0_hps_io_hps_io_usb1_inst_D6      ( HPS_USB_DATA[6]    ),      //                               .hps_io_usb1_inst_D6
        .hps_0_hps_io_hps_io_usb1_inst_D7      ( HPS_USB_DATA[7]    ),      //                               .hps_io_usb1_inst_D7
        .hps_0_hps_io_hps_io_usb1_inst_CLK     ( HPS_USB_CLKOUT    ),       //                               .hps_io_usb1_inst_CLK
        .hps_0_hps_io_hps_io_usb1_inst_STP     ( HPS_USB_STP    ),          //                               .hps_io_usb1_inst_STP
        .hps_0_hps_io_hps_io_usb1_inst_DIR     ( HPS_USB_DIR    ),          //                               .hps_io_usb1_inst_DIR
        .hps_0_hps_io_hps_io_usb1_inst_NXT     ( HPS_USB_NXT    ),          //                               .hps_io_usb1_inst_NXT
       //HPS SPI 		  
		  .hps_0_hps_io_hps_io_spim1_inst_CLK    ( HPS_SPIM_CLK  ),           //                               .hps_io_spim1_inst_CLK
        .hps_0_hps_io_hps_io_spim1_inst_MOSI   ( HPS_SPIM_MOSI ),           //                               .hps_io_spim1_inst_MOSI
        .hps_0_hps_io_hps_io_spim1_inst_MISO   ( HPS_SPIM_MISO ),           //                               .hps_io_spim1_inst_MISO
        .hps_0_hps_io_hps_io_spim1_inst_SS0    ( HPS_SPIM_SS ),             //                               .hps_io_spim1_inst_SS0
      //HPS UART		
		  .hps_0_hps_io_hps_io_uart0_inst_RX     ( HPS_UART_RX    ),          //                               .hps_io_uart0_inst_RX
        .hps_0_hps_io_hps_io_uart0_inst_TX     ( HPS_UART_TX    ),          //                               .hps_io_uart0_inst_TX
		//HPS I2C1
		  .hps_0_hps_io_hps_io_i2c0_inst_SDA     ( HPS_I2C1_SDAT    ),        //                               .hps_io_i2c0_inst_SDA
        .hps_0_hps_io_hps_io_i2c0_inst_SCL     ( HPS_I2C1_SCLK    ),        //                               .hps_io_i2c0_inst_SCL
		//HPS I2C2
		  .hps_0_hps_io_hps_io_i2c1_inst_SDA     ( HPS_I2C2_SDAT    ),        //                               .hps_io_i2c1_inst_SDA
        .hps_0_hps_io_hps_io_i2c1_inst_SCL     ( HPS_I2C2_SCLK    ),        //                               .hps_io_i2c1_inst_SCL
      //HPS GPIO  
		  .hps_0_hps_io_hps_io_gpio_inst_GPIO09  ( HPS_CONV_USB_N),           //                               .hps_io_gpio_inst_GPIO09
        .hps_0_hps_io_hps_io_gpio_inst_GPIO35  ( HPS_ENET_INT_N),           //                               .hps_io_gpio_inst_GPIO35
        .hps_0_hps_io_hps_io_gpio_inst_GPIO40  ( HPS_GPIO[0]),              //                               .hps_io_gpio_inst_GPIO40
        .hps_0_hps_io_hps_io_gpio_inst_GPIO41  ( HPS_GPIO[1]),              //                               .hps_io_gpio_inst_GPIO41
        .hps_0_hps_io_hps_io_gpio_inst_GPIO48  ( HPS_I2C_CONTROL),          //                               .hps_io_gpio_inst_GPIO48
        .hps_0_hps_io_hps_io_gpio_inst_GPIO53  ( HPS_LED),                  //                               .hps_io_gpio_inst_GPIO53
        .hps_0_hps_io_hps_io_gpio_inst_GPIO54  ( HPS_KEY),                  //                               .hps_io_gpio_inst_GPIO54
        .hps_0_hps_io_hps_io_gpio_inst_GPIO61  ( HPS_GSENSOR_INT),          //                               .hps_io_gpio_inst_GPIO61
		 //FPGA soft GPIO 
      		.dipsw_pio_external_connection_export  ( SW   ),                 //                               dipsw_pio_external_connection.export
		//HPS reset output 
		 .hps_0_h2f_reset_reset_n                (hps_fpga_reset_n),          //                               hps_0_h2f_reset.reset_n
       
    );
  


endmodule

  

  打開tools->tcl script,選擇hps_sdram_p0_assignments.tcl進行引腳分配

 

能夠看到引腳已經分配成功

 點擊編譯生成.sof文件,接着鏈接FPGA上電點擊將生成的文件燒寫進去便可。

 

 

五、驗證FPGA部分組件

由於此係統是Qsys生成的,含有jtag to avammbridge,因此能夠用Qsys的System Console完成初步的驗證工做。System Console經過jtag和qsys avmm及鏈接的components進行數據通訊,這通常經過使用tcl腳本命令完成。

打開Qsys並打開以前生成的.qsys文件,選擇Tools->System Console,打開系統控制檯,以下圖所示

選擇File-> Execute Script,彈出以下窗口,這裏選擇不建立

定位到<你的路徑>/DE1_SOC/GHRD,選擇test_led.tcl打開

能夠看到腳本文件已經成功執行。

開發板上,能夠看到LEDR0~9依次循環點亮。

一樣的方法執行test_key&led.tcl腳本


用手保持按下 KEY0 按鈕,而後選擇「打開」test_key&led.tcl 文件,在 message 窗口下你會看到提示信息:0x0e 0x00,同時在 DE1-SOC 開發板上,你將 看到 LEDR0 未點亮,其餘三個 LEDR 是亮的。而後鬆掉 KEY0,LEDR0 也不會亮。(即 保持按下 KEY0~3 中的其中幾個按鈕,而後執行腳本文件,你會發現 message 打印 出按鍵向量值,DE1-SoC 開發板上,按鍵未按下時值是 1,按下爲 0,LEDR 是高電 平點亮,這裏直接把按鍵值賦值給 LED,因此按下的按鍵對應的 LED 是熄滅的)程序邏輯在altera_edge_detector.v文件中

實驗現象以下:

 

 

參考資料

altera官方培訓文檔及資料

相關文章
相關標籤/搜索