Решил вникнуть в синхронный дизайн и сделать обработку следующим образом.
сигналы с процессора на ПЛИС:
CLKOUT - синхронизация для шины
Port_A - адресный бит (0 - регистры, 1 - увеличение адреса)
Port_D - данные
Port_WE - строб записи (активен когда 0)
сигналы с ПЛИС на SRAM:
SRAM_A - биты адреса SRAM
SRAM_D - данные
SRAM_WE - строб записи
Картинка с времянками ниже. Кажный setup по 2 clk (clk=133Мц) - чтоб ПЛИС гарантированно захватила уровни сигналов.
Автомат наподобие, как
Shtirlits давал в соседней теме:
Код
signal state:std_logic:='0'; --начальное состояние
--коммутируем шины: адреса, данных
SRAM_D<=Port_D when (Port_A='1') else (others => 'Z'); --когда Port_A=1
SRAM_A<=WriteAddress;
process(CLKOUT)
begin
if falling_edge(CLKOUT) then
if (state='0' and Port_CS='0' and Port_WE='0' and Port_A='0') then --если Port_CS=0 и Port_WE=0 и Port_A=0 и состояние=0, то данные актуальны для записи врегистры.
state<='1'; --следующее состояние для инкремента адреса
case Port_D(15 downto 12) is --запись в регистры (формируют старшие 4 бита)
when "0000" =>
reg_0<=Port_D(7 downto 0); --запись в регистр 0x0000
when "0001" =>
reg_1<=Port_D(7 downto 0); --запись в регистр 0x1000
....
end case;
end if;
if (state='1' and Port_CS='0' and Port_WE='1' and Port_A='1') then --если Port_CS=0 и Port_WE=1 и Port_A=1 и состояние=1(тоесть уже была запись в регистр или SRAM), то записть в SRAM запрещена - можно менять адрес
state<='0'; --следующее состояние для записи в память или регистры
WriteAddress<=WriteAddress+1; --увеличиваем адрес на 1
end if;
SRAM_CS<=Port_CS; --коммутируем выбор SRAM
SRAM_WE<=Port_WE; --коммутируем разреш. записи
end if;
end Process;
CLKOUT - берется с платы процессора(к его лапке резистор 33 Ом) и 12-см проводом ко входу ПЛИС.
Прошу покритиковать. Имеет ли право дизайн на жизнь, или нужно изменить?
Сообщение отредактировал %-) - Dec 1 2009, 02:31
Эскизы прикрепленных изображений