DE10-Advanced revC demo: PCIe Reference Design - Fundamental

From Terasic Wiki

(Difference between revisions)
Jump to: navigation, search
(FPGA Application Design)
(Windows Based Application Software Design)
Line 92: Line 92:
<div style="color:#404040;">The main program PCIE_FUNDAMENTAL.cpp includes the header file "PCIE.h" and defines the controller address according to the FPGA design.</div>
<div style="color:#404040;">The main program PCIE_FUNDAMENTAL.cpp includes the header file "PCIE.h" and defines the controller address according to the FPGA design.</div>
-
[[Image: DE10-Advanced_revC_PCIE_pic_16.png|500px]]
+
[[Image: DE10-Advanced_revC_PCIE_pic_15.png|500px]]
<div style="color:#404040;">The base address of BUTTON and LED controllers are 0x4000010 and 0x4000020 based on PCIE_BAR4, in respectively. The on-chip memory base address is 0x00000000 relative to the DMA controller. </div>
<div style="color:#404040;">The base address of BUTTON and LED controllers are 0x4000010 and 0x4000020 based on PCIE_BAR4, in respectively. The on-chip memory base address is 0x00000000 relative to the DMA controller. </div>
Line 100: Line 100:
* The PCI express driver is loaded successfully.  
* The PCI express driver is loaded successfully.  
 +
The LED control is implemented by calling PCIE_Write32 API, as shown below:
 +
[[Image: DE10-Advanced_revC_PCIE_pic_16.png|900px]]
-
<div style="color:#404040;">The LED control is implemented by calling PCIE_Write32 API, as shown below:</div>
+
The button status query is implemented by calling the PCIE_Read32 API, as shown below:
 +
[[Image: DE10-Advanced_revC_PCIE_pic_17.png|900px]]
-
{| align="center" style="border-spacing:0;width:15.333cm;"
+
The memory-mapped memory read and write test is implemented by '''PCIE_DmaWrite''' and '''PCIE_DmaRead''' API, as shown below:
-
|- style="border:0.5pt solid #00000a;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"
+
-
|| [[Image: DE10-Advanced_revC_PCIE_pic_17.jpg|500px]]
+
-
|-
+
-
|}
+
-
<div style="color:#404040;">The button status query is implemented by calling the PCIE_Read32 API, as shown below:</div>
+
-
 
+
[[Image: DE10-Advanced_revC_PCIE_pic_18.png|800px]]
-
{| align="center" style="border-spacing:0;width:15.134cm;"
+
-
|- style="border:0.5pt solid #00000a;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"
+
-
|| [[Image: DE10-Advanced_revC_PCIE_pic_18.jpg|500px]]
+
-
|-
+
-
|}
+
-
<div style="color:#404040;">The memory-mapped memory read and write test is implemented by '''PCIE_DmaWrite''' and '''PCIE_DmaRead''' API, as shown below:</div>
+

Revision as of 17:36, 27 August 2018

The application reference design shows how to implement fundamental control and data transfer in DMA. In the design, basic I/O is used to control the BUTTON and LED on the FPGA board. High-speed data transfer is performed by DMA.

Contents

Demonstration Files Location

The demo file is located in the batch folder: CDROM\Demonstrations\ PCIe_Fundamental\demo_batch


The folder includes following files:
  • FPGA Configuration File: PCIe_Fundamental.sof
  • Download Batch file: test.bat
  • Windows Application Software folder : windows_app, includes
    • PCIE_FUNDAMENTAL.exe
    • TERASIC_PCIE_AVMM.DLL

Demonstration Setup

  1. Install the FPGA board on your PC as shown in Figure 1-1.
  2. Configure FPGA with PCIe_Fundamental.sof by executing the test.bat.
  3. Install PCIe driver if necessary. The driver is located in the folder: CDROM\Demonstration\PCIe_SW_KIT\Windows\PCIe_Driver.
  4. Restart Windows
  5. Make sure the Windows has detected the FPGA Board by checking the Windows Control panel as shown in Figure 1-1.
    DE10-Advanced revC PCIE pic 9.jpg
    Figure 1-1 Screenshot for PCIe Driver
  6. Goto windows_app folder, execute PCIE_FUNDAMENTAL.exe. A menu will appear as shown in Figure 1-2.
    DE10-Advanced revC PCIE pic 10.png
    Figure 1-2 Screenshot of Program Menu
  7. Type 0 followed by a ENTER key to select Led Control item, then input 15 (hex 0x0f) will make all led on as shown in Figure 1-3. If input 0 (hex 0x00), all led will be turn off.
    DE10-Advanced revC PCIE pic 11.png
    Figure 1-3 Screenshot of LED Control
  8. Type 1 followed by an ENTER key to select Button Status Read item. The button status will be report as shown in Figure 1-4.
    DE10-Advanced revC PCIE pic 12.png
    Figure 1-4 Screenshot of Button Status Report
  9. Type 2 followed by an ENTER key to select DMA Testing item. The DMA test result will be report as shown in Figure 1-5.
    DE10-Advanced revC PCIE pic 13.png
    Figure 1-5 Screenshot of DMA Memory Test Result
  10. Type 99 followed by an ENTER key to exit this test program

Development Tools

  • Quartus Prime 18.0 Standard Edition
  • Visual C++ 2012

Demonstration Source Code Location

  • Quartus Project: Demonstrations\PCIe_Fundamental
  • C++ Project: Demonstrations\PCIe_SW_KIT\Windows\PCIE_FUNDAMENTAL


FPGA Application Design

Figure 1-6 shows the system block diagram in the FPGA system. In the Qsys, Altera PIO controller is used to control the LED and monitor the Button Status, and the On-Chip memory is used for performing DMA testing. The PIO controllers and the On-Chip memory are connected to the PCI Express Hard IP controller through the Memory-Mapped Interface.

DE10-Advanced revC PCIE pic 14.jpg

Figure 1-6 Hardware block diagram of the PCIe reference design

Windows Based Application Software Design

The application software project is built by Visual C++ 2012. The project includes the following major files:


Table 1-1 LED Indicators
NAME Description
PCIE_FUNDAMENTAL.cpp Main program
PCIE.c Implement dynamically load for TERAISC_PCIE_AVMM.DLL
PCIE.h
TERASIC_PCIE_AVMM.h SDK library file, defines constant and data structure
The main program PCIE_FUNDAMENTAL.cpp includes the header file "PCIE.h" and defines the controller address according to the FPGA design.

DE10-Advanced revC PCIE pic 15.png

The base address of BUTTON and LED controllers are 0x4000010 and 0x4000020 based on PCIE_BAR4, in respectively. The on-chip memory base address is 0x00000000 relative to the DMA controller.


Before accessing the FPGA through PCI Express, the application first calls PCIE_Load to dynamically load the TERASIC_PCIE_AVMM.dll. Then, it call PCIE_Open to open the PCI Express driver. The constant DEFAULT_PCIE_VID and DEFAULT_PCIE_DID used in PCIE_Open are defined in TERASIC_PCIE_AVMM.h. If developer change the Vendor ID and Device ID and PCI Express IP, they also need to change the ID value define in TERASIC_PCIE_AVMM.h. If the return value of PCIE_Open is zero, it means the driver cannot be accessed successfully. In this case, please make sure:
* The FPGA is configured with the associated bit-stream file and the host is rebooted.
  • The PCI express driver is loaded successfully.

The LED control is implemented by calling PCIE_Write32 API, as shown below:

DE10-Advanced revC PCIE pic 16.png

The button status query is implemented by calling the PCIE_Read32 API, as shown below:

DE10-Advanced revC PCIE pic 17.png

The memory-mapped memory read and write test is implemented by PCIE_DmaWrite and PCIE_DmaRead API, as shown below:

DE10-Advanced revC PCIE pic 18.png