во время VBlank=0 память высвобождается и доступна через порт ввода\вывода
во время VBlank=1 происходит сканирование из памяти, запись запрещена.
интерфейс порта такой:
D0..D15 - данные для записи в память
CS - выбор кристалла
WE - строб записи
VBlank - вывод для прерывания процессора (0 - в память можно писать, 1 - нельзя писать, происходит отображение)
Адрес для микросхемы памяти формируется внутри ПЛИС, после каждой записи увеличивается на +1, как только достигнут конца кадра - адрес обнуляется
Память соединена с ПЛИС и доступна хост-процессору через вышеописанный порт.
Не получается поймать данные с хост-порта и сделать запись в SRAM. Адрес инкрементируется исправно, а записи иногда не происходят:
Код
process(Res,Clk,VBlank,HBlank,Pixel4Clock)
begin
if Res='0' then
SRAM_D<="ZZZZZZZZZZZZZZZZ";
SRAM_CS<='1';
SRAM_WE<='1';
SRAM_OE<='1';
elsif (Clk'event and Clk='1') then
if VBlank='1' then
SRAM_D<="ZZZZZZZZZZZZZZZZ";
SRAM_CS<='1';
SRAM_WE<='1';
if HBlank='1' then
if Pixel4Clock(1 downto 0)=0 then
SRAM_A(16 downto 0)<=Pixel4Clock(18 downto 2); -- считывание памяти в дисплей
end if;
if Pixel4Clock(1 downto 0)=1 then
SRAM_CS<='0';
SRAM_OE<='0';
end if;
if Pixel4Clock(1 downto 0)=2 then
Video_R<=SRAM_D(14 downto 11);
Video_G<=SRAM_D( 9 downto 6);
Video_B<=SRAM_D( 4 downto 1);
end if;
if Pixel4Clock(1 downto 0)=3 then
SRAM_CS<='1';
SRAM_OE<='1';
end if;
else
Video_R<="0000";
Video_G<="0000";
Video_B<="0000";
end if;
else
SRAM_A(16 downto 0)<=CPU_A;
SRAM_D<=Port_D; --коммутируем на внешний порт память
SRAM_CS<=Port_CS;
SRAM_WE<=Port_WE;
SRAM_OE<='1';
Video_R<="0000";
Video_G<="0000";
Video_B<="0000";
end if;
end if;
end process;
Port_Write<=Port_CS or Port_WE;
process(Res,Port_Write,VBlank)
begin
if Res='0' then
CPU_A<="00000000000000000";
elsif VBlank='0' then
if (Port_Write'event and Port_Write='1') then -- автоинкремент происходит по поднятию строба записи во время VBlank=0
if CPU_A(16 downto 0)<76799 then
CPU_A<=CPU_A+1; -- автоинкремент адреса
else
CPU_A<="00000000000000000";
end if;
end if;
end if;
end process;
begin
if Res='0' then
SRAM_D<="ZZZZZZZZZZZZZZZZ";
SRAM_CS<='1';
SRAM_WE<='1';
SRAM_OE<='1';
elsif (Clk'event and Clk='1') then
if VBlank='1' then
SRAM_D<="ZZZZZZZZZZZZZZZZ";
SRAM_CS<='1';
SRAM_WE<='1';
if HBlank='1' then
if Pixel4Clock(1 downto 0)=0 then
SRAM_A(16 downto 0)<=Pixel4Clock(18 downto 2); -- считывание памяти в дисплей
end if;
if Pixel4Clock(1 downto 0)=1 then
SRAM_CS<='0';
SRAM_OE<='0';
end if;
if Pixel4Clock(1 downto 0)=2 then
Video_R<=SRAM_D(14 downto 11);
Video_G<=SRAM_D( 9 downto 6);
Video_B<=SRAM_D( 4 downto 1);
end if;
if Pixel4Clock(1 downto 0)=3 then
SRAM_CS<='1';
SRAM_OE<='1';
end if;
else
Video_R<="0000";
Video_G<="0000";
Video_B<="0000";
end if;
else
SRAM_A(16 downto 0)<=CPU_A;
SRAM_D<=Port_D; --коммутируем на внешний порт память
SRAM_CS<=Port_CS;
SRAM_WE<=Port_WE;
SRAM_OE<='1';
Video_R<="0000";
Video_G<="0000";
Video_B<="0000";
end if;
end if;
end process;
Port_Write<=Port_CS or Port_WE;
process(Res,Port_Write,VBlank)
begin
if Res='0' then
CPU_A<="00000000000000000";
elsif VBlank='0' then
if (Port_Write'event and Port_Write='1') then -- автоинкремент происходит по поднятию строба записи во время VBlank=0
if CPU_A(16 downto 0)<76799 then
CPU_A<=CPU_A+1; -- автоинкремент адреса
else
CPU_A<="00000000000000000";
end if;
end if;
end if;
end process;
Помогите огранизовать коммутацию памяти на порт ПЛИС в момент VBlank=0, так чтобы при каждой записи адрес памяти увеличивался
