Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Нужна помошь по NIOS II
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
AlexBalan
Возникла проблема при работе с этим процессором. Написал простенькое периферийное устройство и пытаюсь читать/писать в его регистры. Устройство контролит 4х разрядный hex индикатор- первый регистр (0 адрес внутри устройства) - содержит число, декодируемое на hex, второй регистр(1 адрес в устройстве) содержит всего один флаг - CE (Chip Enable этакий, для понту, гасит hex'ы). Все это собрано SOPC Builder'ом безо всяких там ошибок, тайминги, назначение линий все проверял - все норм, собирается система четко. Далее - темные дела: пишу по адресам а получаю фигу.. Регистры у меня 32 разрядные сделаны (грешил на выравнивание адресов тк поначалу 16разрядные делал..), пробовал как на асме пошагово, так и в сях - выходит фигня какая то, уже несколько недель долблюсь, а толку 0..

Сделал защелку - когда в девайс проц пишет, состояние шины адреса защелкиваю и на диоды вывожу - на адресе все время 1 защелкивается (!) неважно пишу ли я по базовому адресу, али по смещению в пределах адресного пространства девайса....... Я блин уже не знаю что и думать, спецы, откликнитесь!!!

Будьте добры, помогите советом)
vadimuzzz
сигналтапом можно посмотреть, как там запись идет. ну, и код покажите
Stewart Little
Цитата(vadimuzzz @ Mar 24 2011, 15:54) *
сигналтапом можно посмотреть, как там запись идет. ну, и код покажите

Или, для простоты, в моделсиме промоделировать.
Код давайте и hdl, и ниосовский.
AlexBalan
Вот код устройства:

Код
//    HEX Decoder
module HEXDEC(input wire [3:0] in, input CE, output reg [6:0] out);
    always @(in, CE)
    begin
        if(CE)
        begin
            case(in)
                4'h0: out = ~7'b0111111;
                4'h1: out = ~7'b0000110;
                4'h2: out = ~7'b1011011;
                4'h3: out = ~7'b1001111;
                4'h4: out = ~7'b1100110;
                4'h5: out = ~7'b1101101;
                4'h6: out = ~7'b1111101;
                4'h7: out = ~7'b0000111;
                4'h8: out = ~7'b1111111;
                4'h9: out = ~7'b1101111;
                4'hA: out = ~7'b1110111;
                4'hB: out = ~7'b1111100;
                4'hC: out = ~7'b0111001;
                4'hD: out = ~7'b1011110;
                4'hE: out = ~7'b1111001;
                4'hF: out = ~7'b1110001;
            endcase
        end
        else out = ~7'b0000000;
    end
endmodule

//    Top Level
module hex_ctrl
(
    ///    ALTERA AVALON BUS SIGNALS
    // inputs:
    input Address,
    
    input chipselect,
    input clk,
    input reset_n,
    input write_n,
    input [31:0] writedata,

    // outputs:
    output reg [31:0] readdata,
    
    ///    HEX OUTPUTS
    output [6:0] hex0,
    output [6:0] hex1,
    output [6:0] hex2,
    output [6:0] hex3,
    
    output reg GoodWrite,
    output reg [3:0] Address_P
);

    reg [31:0]    HEXDR;    //    HEX DATA REGISTER
    reg [31:0]    HEXCR;    //    HEX CONTROL REGISTER
    

    
    HEXDEC Dec0(.in(HEXDR[03:00]), .CE(HEXCR[0]), .out(hex0));
    HEXDEC Dec1(.in(HEXDR[07:04]), .CE(HEXCR[0]), .out(hex1));
    HEXDEC Dec2(.in(HEXDR[11:08]), .CE(HEXCR[0]), .out(hex2));
    HEXDEC Dec3(.in(HEXDR[15:12]), .CE(HEXCR[0]), .out(hex3));
    
    //    Read
    always @(posedge clk or negedge reset_n)
    begin
        if(reset_n == 0)
        begin
            readdata <= 0;
        end else begin
            case(Address)
                1'b0:    readdata <= HEXDR;
                1'b1:    readdata <= HEXCR;
            endcase
        end
    end


    //    Write
    always @(negedge clk or negedge reset_n)
    begin
        if(reset_n == 1'b0)
        begin
            HEXDR <= 32'h0;
            HEXCR <= 32'b0;
            GoodWrite <= 1'b0;
            Address_P <= 1'b0;
        end
            else
        begin
            if(chipselect && ~write_n)
            begin
            
                GoodWrite <= 1'b1;
                Address_P[0] <= Address;
                
                if(Address == 0) HEXDR <= writedata;
                else if(Address == 1) HEXCR <= writedata;
                
            end
        end
    end
endmodule


//----------------------------------------------------------------------------

И вот код для проца:
Код
#include "system.h"

typedef volatile struct
{
    unsigned int HEXDR;
    unsigned int HEXCR;
} hex_ctrl;

int main()
{
    hex_ctrl* hex0 = (hex_ctrl*)HEX_CTRL_0_BASE;
    hex0 -> HEXCR = 0x1;
    hex0 -> HEXDR = 0x1234;
    return 0;
}


Я новичок в ПЛИСах, может упускаю чего... Если что подскажите - буду благодарен sm.gif
vadimuzzz
Цитата(AlexBalan @ Mar 24 2011, 19:02) *
//----------------------------------------------------------------------------

И вот код для проца:
...

так, а 31-й бит в указателе hex0 чему равен?
AlexBalan
Цитата(vadimuzzz @ Mar 24 2011, 15:12) *
так, а 31-й бит в указателе hex0 чему равен?


Не совсем понял суть вопроса, но равен указатель:
#define HEX_CTRL_0_BASE 0x21060

т.е. 31 бит равен 0, я так понимаю..
vadimuzzz
Цитата(AlexBalan @ Mar 24 2011, 19:17) *
т.е. 31 бит равен 0, я так понимаю..

значит процессор пишет в кэш данных, а не в устройство. используйте alt_remap_uncached(). или через IOWR пишите.
AlexBalan
Цитата(vadimuzzz @ Mar 24 2011, 15:23) *
значит процессор пишет в кэш данных, а не в устройство. используйте alt_remap_uncached(). или через IOWR пишите.


ОО, Спасибо!!! Еще один вопрос: если старший разряд выставить как 1 то я смогу попасть в пространство памяти/устройств*?
vadimuzzz
Цитата(AlexBalan @ Mar 24 2011, 19:28) *
ОО, Спасибо!!! Еще один вопрос: если старший разряд выставить как 1 то я смогу попасть в пространство памяти/устройств*?

этот бит и определяет 1-I/O 0-memory. но это зависит от варианта ниоса. читайте, как у него адресное пространство организовано в Nios II Processor Reference Handbook.
AlexBalan
Спасибо! Ваш ответ многое прояснил)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.