Перейти к содержанию
    

помогите разобраться с AXI lite

Всем привет, друзья помогите разобраться с AXI lite. 

Vivado 2018.3, linux mint

Для начала, думаю можно просто зажечь диоды(их всего 4) на платке с помощью axi_gpio ip и моего контроллера, который пока не работает. Кто знает, может подскажет где ошибка.

 

Диоды исправные, назначены верно, частота подается.

Спасибо

`timescale 1 ns / 1 ps

module project_1 #
(
    parameter integer                           C_M_AXI_ADDR_WIDTH	= 32,
    parameter integer                           C_M_AXI_DATA_WIDTH	= 32
)
(  


    input  wire                                 CLK,
    input  wire                                 A_RESET_N,
    output wire [C_M_AXI_ADDR_WIDTH-1 : 0]      M_AXI_AWADDR,
    
    output wire [2 : 0]                         M_AXI_AWPROT,
    output wire                                 M_AXI_AWVALID,
    input  wire                                 M_AXI_AWREADY,
    
    output wire [C_M_AXI_DATA_WIDTH-1 : 0]      M_AXI_WDATA,
    output wire [C_M_AXI_DATA_WIDTH/8-1 : 0]    M_AXI_WSTRB,
    output wire                                 M_AXI_WVALID,
    input  wire                                 M_AXI_WREADY,
    
    input  wire [1 : 0]                         M_AXI_BRESP,
    input  wire                                 M_AXI_BVALID,
    output wire                                 M_AXI_BREADY,

    output wire [C_M_AXI_ADDR_WIDTH-1 : 0]      M_AXI_ARADDR,
    output wire [2 : 0]                         M_AXI_ARPROT,
    output wire                                 M_AXI_ARVALID,
    input  wire                                 M_AXI_ARREADY,
    input  wire [C_M_AXI_DATA_WIDTH-1 : 0]      M_AXI_RDATA,
    
    input  wire [1 : 0]                         M_AXI_RRESP,
    input  wire                                 M_AXI_RVALID,
    output wire                                 M_AXI_RREADY
);

    reg  	                                    axi_awvalid;
    reg  	                                    axi_wvalid;
    
    
    reg [C_M_AXI_DATA_WIDTH-1 : 0] 	            axi_ardata;
    
    reg     start_single_read;
    reg     start_resp_read;
    reg     axi_arvalid;
    reg     axi_rready;
    
    reg     axi_bready;
    
    
    assign M_AXI_BREADY = axi_bready;
    assign M_AXI_RREADY = axi_rready;




	// адрес на axi, он же регистр данных порта 1 axi_gpio
    assign M_AXI_AWADDR	 = 32'h40000000;
    // записать в регистр данных порта gpio 1 данные, значение должно загореться на диодах
    assign M_AXI_WDATA	 = 32'h0000000A;
    assign M_AXI_AWPROT	 = 3'b000;
    assign M_AXI_AWVALID = axi_awvalid;
    assign M_AXI_WVALID	 = axi_wvalid;
    assign M_AXI_WSTRB	 = 4'b1111;
    
    always @(posedge CLK)										      
    begin                                                                        
        if (A_RESET_N == 0)                                                   
        begin                                                                    
            axi_awvalid <= 1'b0;   
            axi_wvalid <= 1'b0;                                                
        end                                                                             
        else                                                                       
        begin                                                                                                                  
            axi_awvalid <= 1'b1;               
            axi_wvalid <= 1'b1;    
                                                                       
            if (M_AXI_AWREADY && axi_awvalid)                                 
            begin                                                          
                axi_awvalid <= 1'b0;  
                start_single_read <= 1'b1;                                                                
            end    
            
            if (M_AXI_WREADY && axi_wvalid)                                        
            begin                                                                      
                axi_wvalid <= 1'b0;                                                      
            end                                                                   
        end                                                                      
    end                                          
                                                                  

    always @(posedge CLK)                                    
    begin                                                                
        if (A_RESET_N == 0)                                           
        begin                                                            
            axi_bready <= 1'b0;                                            
        end                                                                                       
        else if (M_AXI_BVALID && ~axi_bready)                              
        begin                                                            
            axi_bready <= 1'b1;                                            
        end                                                                                        
        else if (axi_bready)                                               
        begin                                                            
            axi_bready <= 1'b0;                                            
        end                                                                                                   ;                                        
    end  
	              
	              
    assign M_AXI_ARADDR  =  32'h40000008;
    assign M_AXI_ARPROT  =  3'b001;
    assign M_AXI_ARVALID =  axi_arvalid;                                                               
                                                                                                                                             
    always @(posedge CLK)                                                     
    begin                                                                            
        if (A_RESET_N == 0)                                                       
        begin                                                                        
            axi_arvalid <= 1'b0;                                                       
        end                                                                                          
        else if (start_single_read)                                                    
        begin                                                                        
            axi_arvalid <= 1'b1;                                                       
        end                                                                          
        else if (M_AXI_ARREADY && axi_arvalid)                                         
        begin                                                                        
            axi_arvalid <= 1'b0;                                                       
        end                                                                                                                
    end    
    
    
    always @(posedge CLK)                                                     
    begin 
        if (M_AXI_RVALID && ~axi_arvalid)
        begin
            axi_ardata <= M_AXI_RDATA;
        end
    end
    
    always @(posedge CLK)                                    
    begin                                                                 
        if (A_RESET_N == 0 )                                            
        begin                                                             
            axi_rready <= 1'b0;                                             
        end                                                                       
        else if (M_AXI_RVALID && ~axi_rready)                               
        begin                                                             
            axi_rready <= 1'b0;                                             
        end                                                                                                  
        else if (axi_rready)                                                
        begin                                                             
            axi_rready <= 1'b0;                                             
        end                                                                                                  
    end 
	                                                                    
endmodule

 

axi_lite.png

Изменено пользователем Drakonof

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в симуляторе работает? xapp1168 - примеры модулей акси подсистемы

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, des00 сказал:

в симуляторе работает? xapp1168 - примеры модулей акси подсистемы

Каким стимулятором пользоваться?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, Drakonof said:

Каким стимулятором пользоваться?

да любым каким владете, может встроенным в вивадо. Просто акси подсистемы, с нуля, без отладки делать, нужно быть либо гуру, изучившим хорошо стандарт на акси шину либо отчаяным. Судя по коду, у вас акси мастер и нарушены требования A3.3.1  Dependencies between channel handshake signals. Прочитать стандарт, помоделировать примеры из упомянутого выше xapp, внести исправления в свой код и заработает)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заработало) спасибо

 

Пока конечно костыльно, в данном случае не работалоизза цинка, каким то образом мешал передаче данных, цинк убрал, буду разбираться

Изменено пользователем Drakonof

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...