首页 > 代码库 > [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 = 1b1;  // 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] : 7h7f;408 assign oHEX1 = (iSW[14])? hexbus[14: 8] : 7h7f;409 assign oHEX2 = (iSW[14])? hexbus[22:16] : 7h7f;410 assign oHEX3 = (iSW[14])? hexbus[30:24] : 7h7f;411 assign oHEX4 = (iSW[14])? hexbus[ 6: 0] : 7h7f;412 assign oHEX5 = (iSW[14])? hexbus[14: 8] : 7h7f;413 assign oHEX6 = (iSW[14])? hexbus[22:16] : 7h7f;414 assign oHEX7 = (iSW[14])? hexbus[30:24] : 7h7f;415 416 assign inbus = iSW[15:0];417 418 419 // Fan Control,420 wire [7:0] wDuty;421 assign wDuty = (iSW[17:15]==3b000) ? 8d0 : 422                (iSW[17:15]==3b001) ? 8d10 : 423                (iSW[17:15]==3b010) ? 8d20 : 424                (iSW[17:15]==3b011) ? 8d30 : 425                (iSW[17:15]==3b100) ? 8d40 : 426                (iSW[17:15]==3b101) ? 8d50 : 427                (iSW[17:15]==3b110) ? 8d60 :  8d100 ; 428 pwmgen pwm( 429                   .iClk50M(iCLOCK_50),   // 50Mhz clock430                   .iRst_n(1b1),   // 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範例說明