реклама на сайте
подробности

 
 
> Нужна помошь по NIOS II
AlexBalan
сообщение Mar 24 2011, 12:16
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 24-03-11
Пользователь №: 63 843



Возникла проблема при работе с этим процессором. Написал простенькое периферийное устройство и пытаюсь читать/писать в его регистры. Устройство контролит 4х разрядный hex индикатор- первый регистр (0 адрес внутри устройства) - содержит число, декодируемое на hex, второй регистр(1 адрес в устройстве) содержит всего один флаг - CE (Chip Enable этакий, для понту, гасит hex'ы). Все это собрано SOPC Builder'ом безо всяких там ошибок, тайминги, назначение линий все проверял - все норм, собирается система четко. Далее - темные дела: пишу по адресам а получаю фигу.. Регистры у меня 32 разрядные сделаны (грешил на выравнивание адресов тк поначалу 16разрядные делал..), пробовал как на асме пошагово, так и в сях - выходит фигня какая то, уже несколько недель долблюсь, а толку 0..

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

Будьте добры, помогите советом)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AlexBalan
сообщение Mar 24 2011, 13:02
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 24-03-11
Пользователь №: 63 843



Вот код устройства:

Код
//    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

Сообщение отредактировал AlexBalan - Mar 24 2011, 13:04
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Mar 24 2011, 13:12
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(AlexBalan @ Mar 24 2011, 19:02) *
//----------------------------------------------------------------------------

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

так, а 31-й бит в указателе hex0 чему равен?
Go to the top of the page
 
+Quote Post
AlexBalan
сообщение Mar 24 2011, 13:17
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 24-03-11
Пользователь №: 63 843



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


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

т.е. 31 бит равен 0, я так понимаю..
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Mar 24 2011, 13:23
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



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

значит процессор пишет в кэш данных, а не в устройство. используйте alt_remap_uncached(). или через IOWR пишите.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 12:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01429 секунд с 7
ELECTRONIX ©2004-2016