Я не силён в VHDL, пишу на Verilog, но
1) Выходной шине данных для шины Авалон не нужно 3 (Z) состояние.
Авалон - шина мультиплексор.
Промежуточный регистр ставить не нужно.
2) Порт памяти подключеный к Nios должен тактироваться частотой Nios, в противном случае пользовать Clock Crossing Bridge.
В чём затруднение пользования сигналов Авалон?
Советую найти документ mnl_avalon_spec.pdf.
Это подробная спецификация шины Авалон, с диаграммами.
Можно/нужно взять полный набор документации здесь:
http://www.altera.com/literature/lit-nio2.jsp для своей версии.
Там же будет и спецификация.
Вот мой пример чтения регистров компонента, сигнал чтения не использую:
CODE
//-------------------------------------------------------------------
// Read all internal registers management
// Avalon MM slave read signal used only for FIFO access
//
//
always @ (posedge clk)
begin
case( avs_s0_address[7:0] )
DATA_REGISTER: avs_s0_readdata[31:0] <= { 24'b0, fifo_rx_data }; // DATA FIFO RAM
CONTROL_REGISTER: avs_s0_readdata[31:0] <= { 16'b0, control[15:0] }; // All bits of control register
STATUS_REGISTER: avs_s0_readdata[31:0] <= { 16'b0, status }; // All bits of status register
INDEX_REGISTER: avs_s0_readdata[31:0] <= { 24'b0, 2'b0, respond[45:40] }; // Respond index
RESPOND_REGISTER: avs_s0_readdata[31:0] <= respond[39:8]; // card status (R1), OCR(R3), RCA(R6)
(RESPOND_REGISTER+1): avs_s0_readdata[31:0] <= respond[71:40]; // CID CSD access
(RESPOND_REGISTER+2): avs_s0_readdata[31:0] <= respond[103:72]; // CID CSD access
(RESPOND_REGISTER+3): avs_s0_readdata[31:0] <= respond[135:104]; // CID CSD access
default: avs_s0_readdata[31:0] <= { 24'b0, status[7:0] }; // default bus state
endcase
end
//-------------------------------------------------------------------------
Описание доступа:
CODE
/************************************************************************
* DYNAMIC address mode
* BYTE address of register must be used
************************************************************************/
//-------------------------------------------------------------------------------------------------
// Data buffer read / write have separate FIFO buffers 512 bytes depth
#define IOADDR_ALTERA_AVALON_SD_HOST_DATA(base) __IO_CALC_ADDRESS_DYNAMIC(base, 0)
#define IORD_ALTERA_AVALON_SD_HOST_DATA(base) IORD_32DIRECT(base, 0)
#define IOWR_ALTERA_AVALON_SD_HOST_DATA(base, data) IOWR_32DIRECT(base, 0, data)
//-------------------------------------------------------------------------------------------------
// Control register may be read/write
#define IOADDR_ALTERA_AVALON_SD_HOST_CONTROL(base) __IO_CALC_ADDRESS_DYNAMIC(base, 4)
#define IORD_ALTERA_AVALON_SD_HOST_CONTROL(base) IORD_32DIRECT(base, 4)
#define IOWR_ALTERA_AVALON_SD_HOST_CONTROL(base, data) IOWR_32DIRECT(base, 4, data)