Forum Discussion

ZhiqiangLiang's avatar
ZhiqiangLiang
Icon for Occasional Contributor rankOccasional Contributor
7 months ago

convert avalon bus to AXI4-Lite

Hi,

My FPGA model is:

Cyclone 10 LP 10CL120.

I am now using Quartus II 18.1.

In FPGA, I added NIOS II, and I would like to convert avalon bus to AXI4 LIte master. It means that NIOS will send out avalon signal, and the receiver is AXI4 Lite master.

the questions are:

1) is there any in chip IP adapter that can convert avalon to axi4 lite master?

2) if there is no IP adapter in chip, is there any sample code or reference?

22 Replies

  • We noticed that we haven't received a response from you regarding the latest previous question/reply/answer, and will now transitioning your inquiry to our community support. We apologize for any inconvenience this may cause and we appreciate your understanding.

    Please kindly create a new forum post for your further inquiries about avalon and axi4 lite.

    If you have any further questions or concerns, please don't hesitate to reach out. Please login to https://supporttickets.intel.com/s/?language=en_US, view details of the desire request, and post a feed/response within the next 15 days to allow me to continue to support you. After 15 days, this thread will be transitioned to community support. The community users will be able to help you on your follow-up questions.

    The community users will be able to help you on your follow-up questions.

    Thank you for reaching out to us!

    Best Regards,

    Richard Tan

  • ZhiqiangLiang's avatar
    ZhiqiangLiang
    Icon for Occasional Contributor rankOccasional Contributor

    @sstrell

    @RichardTanSY_Altera

    Thank you for your reply!

    In the past a few days, I have been debugging the system in Cyclone 10.

    I did the following things:

    1) In Platform Designer, I create a new IP whose name BF5V. Please see the following picture.

    2) the interface of my IP is AXI4Lite.

    3) I convert Avalon to AXI4Lite. please see the picture below.

    4) in C code, I try to control ADC and etc, and I can control them successfully. however, If I use the following C code to write Avalon bus, the data in S_AXI_AWDATA is not as expected. For example, I write 0x55AA, 0x33, 0x0001, 0x4000 to the bus, but the data on S_AXI_AWDATA is 0x55AA, 0x33, 0x4000. The data 0x0001 is missing.

    Is there any doc about how to convert Avalon to AXI4Lite?

    • RichardT_altera's avatar
      RichardT_altera
      Icon for Super Contributor rankSuper Contributor

      I am not familiar with C code and Nios II. Could you file a new forum case for your follow up question?

      Perhaps you can try to attend the instructor-led training class which occur live on 29th/39th May depending on your region, they provide hands-on training on creating PD system. Hopefully it will helps you to further understand.
      https://learning.intel.com/Developer/learn/courses/982/introduction-to-platform-designer-building-systems

      FYI, you can check your calendar for upcoming classes.


      Regards,
      Richard Tan


    • sstrell's avatar
      sstrell
      Icon for Super Contributor rankSuper Contributor

      Your first screenshot is blocking signal names in Signal Tap and your third screenshot is blocking the addresses that are to be accessed in the new component (guessing it's 0x80000 from the code), so it's difficult to correlate what you are showing in hardware with the code. What address are these data values being written to? That doesn't appear in the code either.

      Is FPGA_SCAN_WRITE supposed to be the write enable signal so why would it appear on the data bus?

      If you're coding Avalon, address and data should be put on the bus simultaneously on the separate signals (address and writedata). These would then translate on the separate channels on the AXI side on different signals: write address channel (AWADDR), write channel (WDATA), write response channel (BRESP).

      Is your design meeting timing?

      More explanation of your code and seeing actual hardware addresses and setup would help.

      Link to the Avalon spec as well: https://www.intel.com/content/www/us/en/docs/programmable/683091/22-3/memory-mapped-interfaces.html

      • ZhiqiangLiang's avatar
        ZhiqiangLiang
        Icon for Occasional Contributor rankOccasional Contributor

        @sstrell

        Please refer to my pseudo-code as follows.

        I am 100% sure the test C code, verilog code, and everything things are correct.

        The axi4lite Verilog code in my project has previously used and verified in my old project, so I confirm Verilog code of Axi4Lite is correct.

        My main uncertainty, doubts and concerns are:

        1) whether I connect/configured avalon to axi4lite correctly.

        2) I left shift 2bits of the bias address of those registers in C code. I don't know whether is correct or not.

        Please help to confirm my upper doubts based on the pictures and pseudo-code I pasted.

        In Verilog code, I defined registers:
        `define SCAN_WADDR_N 6'h18 // 60 <-- 0x18 Left shift 2 bits
        `define SCAN_WDATA_N 6'h19 // 64
        `define SCAN_WRITE_N 6'h1A // 68


        In C code, I access those registers by the following address:
        #define FPGA_SCAN_WADDR (FPGA_REGS_ADDR + (0x18<<2))
        #define FPGA_SCAN_WDATA (FPGA_REGS_ADDR + (0x19<<2))
        #define FPGA_SCAN_WRITE (FPGA_REGS_ADDR + (0x1A<<2))


        In system.h in BSP:
        #define ALT_MODULE_CLASS_BF5V_0 BF5V
        #define BF5V_0_BASE 0x80000 // this address is the same as that in Platform Designer
        #define BF5V_0_IRQ -1
        #define BF5V_0_IRQ_INTERRUPT_CONTROLLER_ID -1
        #define BF5V_0_NAME "/dev/BF5V_0"
        #define BF5V_0_SPAN 256
        #define BF5V_0_TYPE "BF5V"

        The test C code is:
        int main()
        {

        while(1)
        {
        FPGA_Write(FPGA_SCAN_WADDR, 0x55AA); // write address
        FPGA_Write(FPGA_SCAN_WDATA, 0x33); // write data
        FPGA_Write(FPGA_SCAN_WRITE, 0x0001); // write enable signal
        FPGA_Write(FPGA_SCAN_WRITE, 0x0000); // clear write enable signal
        }
        return 1;
        }