|
Нужна помошь по NIOS II |
|
|
|
Mar 24 2011, 12:16
|
Участник

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

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

Группа: Участник
Сообщений: 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; } Я новичок в ПЛИСах, может упускаю чего... Если что подскажите - буду благодарен
Сообщение отредактировал AlexBalan - Mar 24 2011, 13:04
|
|
|
|
|
Mar 24 2011, 13:17
|
Участник

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

|
Цитата(vadimuzzz @ Mar 24 2011, 15:12)  так, а 31-й бит в указателе hex0 чему равен? Не совсем понял суть вопроса, но равен указатель: #define HEX_CTRL_0_BASE 0x21060 т.е. 31 бит равен 0, я так понимаю..
|
|
|
|
|
Mar 24 2011, 13:28
|
Участник

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

|
Цитата(vadimuzzz @ Mar 24 2011, 15:23)  значит процессор пишет в кэш данных, а не в устройство. используйте alt_remap_uncached(). или через IOWR пишите. ОО, Спасибо!!! Еще один вопрос: если старший разряд выставить как 1 то я смогу попасть в пространство памяти/устройств*?
|
|
|
|
|
Mar 24 2011, 13:38
|
Участник

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

|
Спасибо! Ваш ответ многое прояснил)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|