Цитата(Stewart Little @ Oct 5 2008, 13:16)

У авалона две однонаправленных шины данных - одна на запись, другая на чтение. А у стандартной внешней памяти шина двунаправленная. Так что тристейт все равно необходим.
В последнем утверждении я с вами не согласен, необходимости в тристейте нет! Из документации к Авалону явно видно , что в основном он используется когда требуется подключить несколько устройств, которые будут использовать одну шину адреса/данных. В моем случае идет подключение напрямую к шине по интерфейсу Avalon-MM Slave. Программный код "блока подключения внешней памяти" в моем примере выгляит так:
Код
module SRAM
(
// Host Data
oDATA,iDATA,iADDR,
iWE_N,iOE_N,
iCE_N,iCLK,
// SRAM
SRAM_DQ,
SRAM_ADDR,
SRAM_WE_N,
SRAM_CE_N,
SRAM_OE_N
);
// Host Side
input [7:0] iDATA;
output [7:0] oDATA;
input [5:0] iADDR;
input iWE_N,iOE_N;
input iCE_N,iCLK;
// SRAM Side
inout [7:0] SRAM_DQ;
output [5:0] SRAM_ADDR;
output SRAM_WE_N,
SRAM_CE_N,
SRAM_OE_N;
assign SRAM_DQ = SRAM_WE_N ? 8'hzz : iDATA;
assign oDATA = SRAM_DQ;
assign SRAM_ADDR = iADDR;
assign SRAM_WE_N = iWE_N;
assign SRAM_OE_N = iOE_N;
assign SRAM_CE_N = iCE_N;
endmodule
А в NIOS обращение выглядит как:
Код
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
unsigned char* ptr_byte;
unsigned char a;
int main (void)
{
ptr_byte = (unsigned char*)SRAM_INST_BASE;
while(1)
{
IOWR(VYHOD_BASE,0,1); // использую для синхронизации оциллографа
*ptr_byte = 0x55; //процесс записи
IOWR(VYHOD_BASE,0,0);// использую для синхронизации оциллографа
a = *ptr_byte; //процесс чтения
};
return 0;
}
Непонятен только один вопрос, в процессе чтения на осцллографе наблюдаю 4 сигнала chipselect (идут подряд), причем идет изменение адресов. Такое чувство, что шина данных считается 32 разрядной, хотя указатель *ptr_byte обозначен как unsigned char. При изменении разрядности шины данных с 8 до 16 таких сигналов становится 2!