Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Общение с памятью через порт ввода-вывода
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
penauch
для видеоконтроллера требуется сделать разделяемый доступ к памяти SRAM.

во время 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;


Помогите огранизовать коммутацию памяти на порт ПЛИС в момент VBlank=0, так чтобы при каждой записи адрес памяти увеличивался 1111493779.gif
lamination
1. Синхронны ли внутренний клок и Port_CS,Port_WE,....?
2. Проверьте, точно ли при таком назначении SRAM_D синтезируется внешняя двунаправленная шина.
3. В режиме burst записи это работать не будет - получится только один фронт на несколько циклов записи.
Код
Port_Write<=Port_CS or Port_WE;
.....
if (Port_Write'event and Port_Write='1') then
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.