Skocz do zawartości

Problem z adresowaniem własnego komponentu


Pomocna odpowiedź

Napisano

Używam płytki Maximator i próbuję stworzyć własny komponent podłączony do soft-procesora.

Czyli najpierw konfiguruję Nios2, podłączam pamięć SRAM dla programu i JTAG-UART do testowania.

Moim celem jest utworzenie prostego układu peryferyjnego - sterownika 4 diod LED dostępnych na płytce.

Połączenia układu wyglądają następująco:

Komponent reg16_avalon_interface_0 to mój pierwszy komponent podłączany przez magistralę avalon - wynalazek Altery, ale łatwiejsza niż AXI na początek.

Kod komponentu jest banalny:

module new_component (
	input  wire        clock_sink_clk,          //   clock_sink.clk
	input  wire        reset_sink_reset,        //   reset_sink.reset
	input  wire        avalon_slave_read,       // avalon_slave.read
	input  wire        avalon_slave_write,      //             .write
	output wire [15:0] avalon_slave_readdata,   //             .readdata
	input  wire [15:0] avalon_slave_writedata,  //             .writedata
	input  wire [1:0]  avalon_slave_byteenable, //             .byteenable
	input  wire        avalon_slave_chipselect, //             .chipselect
	output wire [3:0]  conduit_end_q_export     //  conduit_end.new_signal
);

reg [3:0] q;

always @(posedge clock_sink_clk)
begin
	if (reset_sink_reset == 1'b1)
		q <= 8'h00;
	else begin
		if (avalon_slave_chipselect  & avalon_slave_write  & avalon_slave_byteenable[1])
			q[3:0] <= avalon_slave_writedata[3:0];
	end
end

assign avalon_slave_readdata  = q;
assign conduit_end_q_export  = ~q;

endmodule

Czyli w skrócie, podłączam reset, clk, wyjścia do condui_end_q_export i chciałbym żeby to co zanegowane zostanie zapisane na magistrali, pojawiło się na wyjściu.

Do programowania używam Eclipse, wszystko standardowo jak wygeneruje środowisko Quartus:

Program jest prosty, zapala kolejne bity w 32-bitowym rejestrze układu.

I tutaj pojawia się problem, którego nie umiem poprawić, ani zrozumieć - dlaczego bity w układzie peryferyjnym odpowiadają górnemu pół-słowu, czyli bitom [19:16], zamiast [3:0]?

Może ktoś ma pomysł co robię źle?

Używam płytki Maximator i próbuję stworzyć własny komponent podłączony do soft-procesora.

Czyli najpierw konfiguruję Nios2, podłączam pamięć SRAM dla programu i JTAG-UART do testowania.

...

I tutaj pojawia się problem, którego nie umiem poprawić, ani zrozumieć - dlaczego bity w układzie peryferyjnym odpowiadają górnemu pół-słowu, czyli bitom [19:16], zamiast [3:0]?

Może ktoś ma pomysł co robię źle?

Elvis strzelam w ciemno, ale może to jest twój problem:

http://www.alterawiki.com/wiki/Avalon-MM_Byte_Ordering

https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/hb/nios2/mm_byte_ordering.pdf

https://alteraforum.com/forum/showthread.php?t=40292

Pozdrawiam

Właśnie kolejność bajtów mi nie bardzo pasuje - bo wtedy zamiast pierwszego powinien być ostatni.

Ale już widzę, że to coś z adresowaniem - jeśli zamiast makra IOWR, użyję brzydkiego rzutowania:

		volatile uint8_t *test = (volatile uint8_t*)(REG16_AVALON_INTERFACE_0_BASE);

To wtedy adresowanie działa jak powinno. To chyba mi w tej chwili wystarczy. W sumie zależy mi na magistrali AXI/APB, a nie avalon.

W każdym razie dziękuję za podpowiedź.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...