[DE2i-150] 重建PCIe_Fundmental範例說明

编程爱好者联盟 2016-10-12

以下資料的整理主要是做備忘錄,避免以後忘了,順便留給需要的人。

==========================================

本文主要是參考友晶科技的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_PCIE
139 
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 declarations
196 //=======================================================
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_PCIE
317 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 declarations
373 //=======================================================
374 
375 
376 wire [31:0] hexbus;
377 wire [15:0] inbus;
378 
379 
380 //=======================================================
381 //  Structural coding
382 //=======================================================
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_0
388         .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_0
390         .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_powerdown
392 //        .pcie_hard_ip_0_powerdown_gxb_powerdown (oPCIE_WAKE_N), //                         .gxb_powerdown
393         .pcie_ip_refclk_export           (iPCIE_REFCLK_P),           //    pcie_hard_ip_0_refclk.export
394         .pcie_ip_pcie_rstn_export        (iPCIE_PERST_N),
395 //        .hexport_external_connection_export     (hexbus),     // hexport_external_connection.export
396 //        .inport_external_connection_export      (inbus),       //  inport_external_connection.export
397         .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 used
403 
404 //////////// FAN Control //////////
405 //assign FAN_CTRL = 1'b1; // turn on FAN
406 //iSW close the 7-segment led, add by 2013/10/10
407 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 clock
430                   .iRst_n(1'b1),   // reset, low active
431                   .iDuty(wDuty),    // Range is 0~100
432                   .oPWM(FAN_CTRL),
433 //                  .oSampClk,
434 //                  .oErrorValue
435               );
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系統的設定。

DbhVozhcEZvQGMfR6Pkc-A33RMAoVqH3kdctdDxLPiyW2gOICeiQxaj8haPKtfXpmdcDHLw8PQCuzX4sNwl0ufXEy2w2unNubmhCiHWhnfX9UVbqiEJ1Ve4PgTJngKc_.png

Fig.1 Qsys系統圖

其中pcie_ip模組的設定如Fig.2所示。

DbhVozhcEZvQGMfR6Pkc-A33RMAoVqH3kdctdDxLPiyW2gOICeiQxaj8haPKtfXpmdcDHLw8PQCuzX4sNwl0uYDCASntdbdv855CzZZ02H2hqc81neDER3jK_Ih8wnMv.png

Fig.2 PCIe_ip模組設定

SGDMA模組設定如下:

DbhVozhcEZvQGMfR6Pkc-A33RMAoVqH3kdctdDxLPiyW2gOICeiQxaj8haPKtfXpmdcDHLw8PQCuzX4sNwl0uVdDSQbURbAUsT3fcC-eliN62e38xc0iJHwtsJ7XmEX0.png

Fig.3 SGDMA設定

接下來是Nios設定

DbhVozhcEZvQGMfR6Pkc-A33RMAoVqH3kdctdDxLPiyW2gOICeiQxaj8haPKtfXpmdcDHLw8PQCuzX4sNwl0uYMHsGDTK_zK09bY0t3RmcacxcerhiN9lMTWsgIyzhqT.png

Fig.4 Nios設定

LED模組設定

DbhVozhcEZvQGMfR6Pkc-A33RMAoVqH3kdctdDxLPiyW2gOICeiQxaj8haPKtfXpmdcDHLw8PQCuzX4sNwl0uW3LamFV-tFnP4unye58LZZmppXYa64qMtTkju-KBnIP.png

Fig.5 LED模組

Button模組設定:

DbhVozhcEZvQGMfR6Pkc-A33RMAoVqH3kdctdDxLPiyW2gOICeiQxaj8haPKtfXpmdcDHLw8PQCuzX4sNwl0uYmgStuQqOjCb5mlyn9-HFue8MN5ecs853ObC2KgKb6h.png

Fig. 6 Button模組設定

FIFO_memory模組設定:

DbhVozhcEZvQGMfR6Pkc-A33RMAoVqH3kdctdDxLPiyW2gOICeiQxaj8haPKtfXpmdcDHLw8PQCuzX4sNwl0uRHjXzTfv0Ikx8aEcrG8hD-e8MN5ecs853ObC2KgKb6h.png

Fig.7 FIFO_memory模組設定

Onchip_memory模組設定:

DbhVozhcEZvQGMfR6Pkc-A33RMAoVqH3kdctdDxLPiyW2gOICeiQxaj8haPKtfXpmdcDHLw8PQCuzX4sNwl0ueIHQwroHwkwivKLtL8JJontkk9Xsi8HlnNJSgqRZgPI.png

Fig. 8 On_Chip Memory模組設定

設定完成後就可以按下generate產生Qsys系統。

DbhVozhcEZvQGMfR6Pkc-A33RMAoVqH3kdctdDxLPiyW2gOICeiQxaj8haPKtfXpmdcDHLw8PQCuzX4sNwl0uYVYhFbFqd1ATsDb2-b8Boue8MN5ecs853ObC2KgKb6h.png

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

DbhVozhcEZvQGMfR6Pkc-A33RMAoVqH3kdctdDxLPiyW2gOICeiQxaj8haPKtfXpmdcDHLw8PQCuzX4sNwl0uQdZ-xjf65nQj9oK8snJ8POhqc81neDER3jK_Ih8wnMv.png

就可以按[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

相关推荐