首页 > 代码库 > [DE2i-150] 重建PCIe_Fundmental範例說明
[DE2i-150] 重建PCIe_Fundmental範例說明
以下資料的整理主要是做備忘錄,避免以後忘了,順便留給需要的人。
==========================================
本文主要是參考友晶科技的DE2i-150光碟裡面的PCie_Fundmental範例,再重新打造一個新的範例程式。
1 // ============================================================================ 2 // Copyright (c) 2012 by Terasic Technologies Inc. 3 // Copyright (c) 2013 by TKU ICLAB. 4 // ============================================================================ 5 // 6 // 7 // ============================================================================ 8 //Date: Wed Jun 27 19:19:53 2012 9 // ============================================================================ 10 // 11 // Revision History : 12 // -------------------------------------------------------------------- 13 // Ver :| Author :| Mod. Date :| Changes Made: 14 // V1.0 :| Shih-An Li :| 10/10/2013 :| Initial Revision, add SW14 15 // to control 7-seg lights 16 // -------------------------------------------------------------------- 17 18 `define ENABLE_PCIE 19 module de2i_pci_top( 20 21 ///////////CLOCK2///////////// 22 iCLOCK2_50, 23 24 /////////CLOCK3///////// 25 iCLOCK3_50, 26 27 /////////CLOCK///////// 28 iCLOCK_50, 29 30 /////////DRAM///////// 31 oDRAM_ADDR, 32 oDRAM_BA, 33 oDRAM_CAS_N, 34 oDRAM_CKE, 35 oDRAM_CLK, 36 oDRAM_CS_N, 37 DRAM_DQ, 38 oDRAM_DQM, 39 oDRAM_RAS_N, 40 oDRAM_WE_N, 41 42 /////////EEP///////// 43 oEEP_I2C_SCLK, 44 EEP_I2C_SDAT, 45 46 /////////ENET///////// 47 oENET_GTX_CLK, 48 iENET_INT_N, 49 iENET_LINK100, 50 oENET_MDC, 51 ENET_MDIO, 52 oENET_RST_N, 53 iENET_RX_CLK, 54 iENET_RX_COL, 55 iENET_RX_CRS, 56 iENET_RX_DATA, 57 iENET_RX_DV, 58 iENET_RX_ER, 59 iENET_TX_CLK, 60 oENET_TX_DATA, 61 oENET_TX_EN, 62 oENET_TX_ER, 63 64 /////////FAN///////// 65 FAN_CTRL, 66 67 /////////FL///////// 68 oFL_CE_N, 69 oFL_OE_N, 70 iFL_RY, 71 oFL_WE_N, 72 oFL_WP_N, 73 oFL_RESET_N, 74 /////////FS///////// 75 FS_DQ, 76 oFS_ADDR, 77 /////////GPIO///////// 78 GPIO, 79 80 /////////G///////// 81 iG_SENSOR_INT1, 82 oG_SENSOR_SCLK, 83 G_SENSOR_SDAT, 84 85 /////////HEX///////// 86 oHEX0, 87 oHEX1, 88 oHEX2, 89 oHEX3, 90 oHEX4, 91 oHEX5, 92 oHEX6, 93 oHEX7, 94 95 /////////HSMC///////// 96 iHSMC_CLKIN0, 97 iHSMC_CLKIN_N1, 98 iHSMC_CLKIN_N2, 99 iHSMC_CLKIN_P1,100 iHSMC_CLKIN_P2,101 oHSMC_CLKOUT0,102 HSMC_CLKOUT_N1,103 HSMC_CLKOUT_N2,104 HSMC_CLKOUT_P1,105 HSMC_CLKOUT_P2,106 HSMC_D,107 oHSMC_I2C_SCLK,108 HSMC_I2C_SDAT,109 HSMC_RX_D_N,110 HSMC_RX_D_P,111 HSMC_TX_D_N,112 HSMC_TX_D_P,113 114 /////////I2C/////////115 oI2C_SCLK,116 I2C_SDAT,117 118 /////////IRDA/////////119 iIRDA_RXD,120 121 /////////KEY/////////122 iKEY,123 124 /////////LCD/////////125 LCD_DATA,126 oLCD_EN,127 oLCD_ON,128 oLCD_RS,129 oLCD_RW,130 131 /////////LEDG/////////132 oLEDG,133 134 /////////LEDR/////////135 oLEDR,136 137 /////////PCIE/////////138 `ifdef ENABLE_PCIE139 140 iPCIE_PERST_N,141 iPCIE_REFCLK_P,142 iPCIE_RX_P,143 oPCIE_TX_P,144 oPCIE_WAKE_N,145 `endif 146 /////////SD/////////147 oSD_CLK,148 SD_CMD,149 SD_DAT,150 iSD_WP_N,151 152 /////////SMA/////////153 iSMA_CLKIN,154 oSMA_CLKOUT,155 156 /////////SSRAM/////////157 oSSRAM_ADSC_N,158 oSSRAM_ADSP_N,159 oSSRAM_ADV_N,160 oSSRAM_BE,161 oSSRAM_CLK,162 oSSRAM_GW_N,163 oSSRAM_OE_N,164 oSSRAM_WE_N,165 oSSRAM0_CE_N,166 oSSRAM1_CE_N, 167 /////////SW/////////168 iSW,169 170 /////////TD/////////171 iTD_CLK27,172 iTD_DATA,173 iTD_HS,174 oTD_RESET_N,175 iTD_VS,176 177 /////////UART/////////178 iUART_CTS,179 oUART_RTS,180 iUART_RXD,181 oUART_TXD,182 183 /////////VGA/////////184 oVGA_B,185 oVGA_BLANK_N,186 oVGA_CLK,187 oVGA_G,188 oVGA_HS,189 oVGA_R,190 oVGA_SYNC_N,191 oVGA_VS,192 );193 194 //=======================================================195 // PORT declarations196 //=======================================================197 198 ///////////CLOCK2/////////////199 200 input iCLOCK2_50;201 202 ///////// CLOCK3 /////////203 input iCLOCK3_50;204 205 ///////// CLOCK /////////206 input iCLOCK_50;207 208 ///////// DRAM /////////209 output [12:0] oDRAM_ADDR;210 output [1:0] oDRAM_BA;211 output oDRAM_CAS_N;212 output oDRAM_CKE;213 output oDRAM_CLK;214 output oDRAM_CS_N;215 inout [31:0] DRAM_DQ;216 output [3:0] oDRAM_DQM;217 output oDRAM_RAS_N;218 output oDRAM_WE_N;219 220 ///////// EEP /////////221 output oEEP_I2C_SCLK;222 inout EEP_I2C_SDAT;223 224 ///////// ENET /////////225 output oENET_GTX_CLK;226 input iENET_INT_N;227 input iENET_LINK100;228 output oENET_MDC;229 inout ENET_MDIO;230 output oENET_RST_N;231 input iENET_RX_CLK;232 input iENET_RX_COL;233 input iENET_RX_CRS;234 input [3:0] iENET_RX_DATA;235 input iENET_RX_DV;236 input iENET_RX_ER;237 input iENET_TX_CLK;238 output [3:0] oENET_TX_DATA;239 output oENET_TX_EN;240 output oENET_TX_ER;241 242 ///////// FAN /////////243 inout FAN_CTRL;244 245 ///////// FL /////////246 output oFL_CE_N;247 output oFL_OE_N;248 input iFL_RY;249 output oFL_WE_N;250 output oFL_WP_N;251 output oFL_RESET_N;252 ///////// FS /////////253 inout [31:0] FS_DQ;254 output [26:0] oFS_ADDR;255 ///////// GPIO /////////256 inout [35:0] GPIO;257 258 ///////// G /////////259 input iG_SENSOR_INT1;260 output oG_SENSOR_SCLK;261 inout G_SENSOR_SDAT;262 263 ///////// HEX /////////264 output [6:0] oHEX0;265 output [6:0] oHEX1;266 output [6:0] oHEX2;267 output [6:0] oHEX3;268 output [6:0] oHEX4;269 output [6:0] oHEX5;270 output [6:0] oHEX6;271 output [6:0] oHEX7;272 273 ///////// HSMC /////////274 input iHSMC_CLKIN0;275 input iHSMC_CLKIN_N1;276 input iHSMC_CLKIN_N2;277 input iHSMC_CLKIN_P1;278 input iHSMC_CLKIN_P2;279 output oHSMC_CLKOUT0;280 inout HSMC_CLKOUT_N1;281 inout HSMC_CLKOUT_N2;282 inout HSMC_CLKOUT_P1;283 inout HSMC_CLKOUT_P2;284 inout [3:0] HSMC_D;285 output oHSMC_I2C_SCLK;286 inout HSMC_I2C_SDAT;287 inout [16:0] HSMC_RX_D_N;288 inout [16:0] HSMC_RX_D_P;289 inout [16:0] HSMC_TX_D_N;290 inout [16:0] HSMC_TX_D_P;291 292 ///////// I2C /////////293 output oI2C_SCLK;294 inout I2C_SDAT;295 296 ///////// IRDA /////////297 input iIRDA_RXD;298 299 ///////// KEY /////////300 input [3:0] iKEY;301 302 ///////// LCD /////////303 inout [7:0] LCD_DATA;304 output oLCD_EN;305 output oLCD_ON;306 output oLCD_RS;307 output oLCD_RW;308 309 ///////// LEDG /////////310 output [8:0] oLEDG;311 312 ///////// LEDR /////////313 output [17:0] oLEDR;314 315 ///////// PCIE /////////316 `ifdef ENABLE_PCIE317 input iPCIE_PERST_N;318 input iPCIE_REFCLK_P;319 input [1:0] iPCIE_RX_P;320 output [1:0] oPCIE_TX_P;321 output oPCIE_WAKE_N;322 `endif 323 ///////// SD /////////324 output oSD_CLK;325 inout SD_CMD;326 inout [3:0] SD_DAT;327 input iSD_WP_N;328 329 ///////// SMA /////////330 input iSMA_CLKIN;331 output oSMA_CLKOUT;332 333 ///////// SSRAM /////////334 output oSSRAM_ADSC_N;335 output oSSRAM_ADSP_N;336 output oSSRAM_ADV_N;337 output [3:0] oSSRAM_BE;338 output oSSRAM_CLK;339 output oSSRAM_GW_N;340 output oSSRAM_OE_N;341 output oSSRAM_WE_N;342 output oSSRAM0_CE_N;343 output oSSRAM1_CE_N;344 345 ///////// SW /////////346 input [17:0] iSW;347 348 ///////// TD /////////349 input iTD_CLK27;350 input [7:0] iTD_DATA;351 input iTD_HS;352 output oTD_RESET_N;353 input iTD_VS;354 355 ///////// UART /////////356 input iUART_CTS;357 output oUART_RTS;358 input iUART_RXD;359 output oUART_TXD;360 361 ///////// VGA /////////362 output [7:0] oVGA_B;363 output oVGA_BLANK_N;364 output oVGA_CLK;365 output [7:0] oVGA_G;366 output oVGA_HS;367 output [7:0] oVGA_R;368 output oVGA_SYNC_N;369 output oVGA_VS;370 371 //=======================================================372 // REG/WIRE declarations373 //=======================================================374 375 376 wire [31:0] hexbus;377 wire [15:0] inbus;378 379 380 //=======================================================381 // Structural coding382 //=======================================================383 384 pcihellocore u0 (385 .clk_clk(iCLOCK_50),386 .reset_reset_n(iKEY[0]),387 .pcie_ip_rx_in_rx_datain_0 (iPCIE_RX_P[0]), // pcie_hard_ip_0_rx_in.rx_datain_0388 .pcie_ip_rx_in_rx_datain_1 (iPCIE_RX_P[1]),389 .pcie_ip_tx_out_tx_dataout_0 (oPCIE_TX_P[0]), // pcie_hard_ip_0_tx_out.tx_dataout_0390 .pcie_ip_tx_out_tx_dataout_1 (oPCIE_TX_P[1]),391 // .pcie_hard_ip_0_powerdown_pll_powerdown (oPCIE_WAKE_N), // pcie_hard_ip_0_powerdown.pll_powerdown392 // .pcie_hard_ip_0_powerdown_gxb_powerdown (oPCIE_WAKE_N), // .gxb_powerdown393 .pcie_ip_refclk_export (iPCIE_REFCLK_P), // pcie_hard_ip_0_refclk.export394 .pcie_ip_pcie_rstn_export (iPCIE_PERST_N),395 // .hexport_external_connection_export (hexbus), // hexport_external_connection.export396 // .inport_external_connection_export (inbus), // inport_external_connection.export397 .led_external_connection_export(oLEDG),398 .button_external_connection_export(iKEY)399 );400 401 402 assign oPCIE_WAKE_N = 1‘b1; // for ubuntu poweroff instruction using, if set to 0, the poweroff cant be used403 404 //////////// FAN Control //////////405 //assign FAN_CTRL = 1‘b1; // turn on FAN406 //iSW close the 7-segment led, add by 2013/10/10407 assign oHEX0 = (iSW[14])? hexbus[ 6: 0] : 7‘h7f;408 assign oHEX1 = (iSW[14])? hexbus[14: 8] : 7‘h7f;409 assign oHEX2 = (iSW[14])? hexbus[22:16] : 7‘h7f;410 assign oHEX3 = (iSW[14])? hexbus[30:24] : 7‘h7f;411 assign oHEX4 = (iSW[14])? hexbus[ 6: 0] : 7‘h7f;412 assign oHEX5 = (iSW[14])? hexbus[14: 8] : 7‘h7f;413 assign oHEX6 = (iSW[14])? hexbus[22:16] : 7‘h7f;414 assign oHEX7 = (iSW[14])? hexbus[30:24] : 7‘h7f;415 416 assign inbus = iSW[15:0];417 418 419 // Fan Control,420 wire [7:0] wDuty;421 assign wDuty = (iSW[17:15]==3‘b000) ? 8‘d0 : 422 (iSW[17:15]==3‘b001) ? 8‘d10 : 423 (iSW[17:15]==3‘b010) ? 8‘d20 : 424 (iSW[17:15]==3‘b011) ? 8‘d30 : 425 (iSW[17:15]==3‘b100) ? 8‘d40 : 426 (iSW[17:15]==3‘b101) ? 8‘d50 : 427 (iSW[17:15]==3‘b110) ? 8‘d60 : 8‘d100 ; 428 pwmgen pwm( 429 .iClk50M(iCLOCK_50), // 50Mhz clock430 .iRst_n(1‘b1), // reset, low active431 .iDuty(wDuty), // Range is 0~100432 .oPWM(FAN_CTRL),433 // .oSampClk,434 // .oErrorValue435 );436 437 wire hb_50;438 heart_beat heart_beat_clk50(439 .clk(iCLOCK_50),440 .led(oLEDR[0])441 );442 443 444 445 endmodule
程式碼說明:
Line 384~399是Qsys模組的腳位連接。因為是選用PCIe Gen1 x2所以會用到兩個PCIe訊號。
Line 428~435是風扇控制程式,由於風扇太吵了,所以寫了一個PWM程式用SW[17:15]來控制風扇轉速。
=================================================================
以下來介紹Qsys系統的設定。
Fig.1 Qsys系統圖
其中pcie_ip模組的設定如Fig.2所示。
Fig.2 PCIe_ip模組設定
SGDMA模組設定如下:
Fig.3 SGDMA設定
接下來是Nios設定
Fig.4 Nios設定
LED模組設定
Fig.5 LED模組
Button模組設定:
Fig. 6 Button模組設定
FIFO_memory模組設定:
Fig.7 FIFO_memory模組設定
Onchip_memory模組設定:
Fig. 8 On_Chip Memory模組設定
設定完成後就可以按下generate產生Qsys系統。
Fig.9 Generate Qsys
經由以上設定後,Quartus硬體也都設定完成。
接下來就可以用Quartus 編譯 de2i_pci_top專案了。
等編譯完成後,按照下面步驟執行。
Step 1: 下載 de2i_pci_top.sof 檔至DE2i-150 的FPGA晶片內。
Step 2: 安裝PCIe_DriverInstall目錄下的驅動程式。(如果之前有裝過,就可以跳過)
Step 3: windwos重新開機,讓作業系統重新抓PCIe的新硬體。
Step 4: 執行專案目錄下的\windows_app_bcb6\output\app.exe
就可以按[0]控制LED,[1]讀取按鈕。
但是按[2]和[3]就會出現錯誤,這是由於FIFO跟onchip_memory內沒有資料,因此需要事先把FIFO與onchip_memory的初始檔放到
.\pcihellocore\synthesis\submodules 目錄下,本人已經把檔案放在附件的code中,有需要的人就去下載吧。
再重新編譯Qsys和Quartus專案後,執行步驟Step1~step4後就可以順利執行[2]和[3]功能了。
==================================================================================
以上是整個PCIe_Fundmental範例硬體檔的設定部分,下次再來研究講解VC程式部分,PC如何跟FPGA用PCIe做溝通。
附件下載URL: http://files.cnblogs.com/files/lishyhan/PCIe_Fundmental.zip
[DE2i-150] 重建PCIe_Fundmental範例說明