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 FPGA 設計流程 基於 SoC 的 FPGA 嵌入式系統硬件與軟件的開發流程如圖所示。linux
首先要基於 Qsys 規劃系統須要的外設,包括 HPS 與 FPGA 各自的接口。HPS 外設只須要根據 DE1-SoC 硬 件屬性進行設定便可,FPGA 外設依舊是經過 IP 模塊的方式添加。而後創建各個模塊間 的鏈接(時鐘,復位,總線),最後產生出硬件與軟件開發各自所需的檔案ios
通常從系統設計開始到生成boot linux操做系統SD Card,其所須要的軟件工具與生成檔案以下:web
下圖說明了GSRD的完整構建流程。編程
下表顯示了構建流程中使用的工具:服務器
工具 | 描述 | 部分 |
---|---|---|
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工程,瞭解HPS的組件設定。ide
Qsys工程的建立過程不是這裏的重點,瞭解建立過程能夠參考文章完整的SOPC開發流程體驗,這裏直接打開官方培訓給的工程(提取碼dhgv,不要放到中文路徑下)工具
進入de1_soc_training\de1_soc_training\lab\HW\DE1_SoC_GHRD,雙擊soc_system.qpf打開工程
點擊Qsys打開Qsys工具,打開.qsys系統,能夠看到裏面已經包含了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 生成完後,會產生出許多能夠被 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上電點擊將生成的文件燒寫進去便可。
由於此係統是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文件中
實驗現象以下: