реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Общение с памятью через порт ввода-вывода, видеоконтроллер
penauch
сообщение Oct 26 2009, 06:25
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 12-10-09
Пользователь №: 52 902



для видеоконтроллера требуется сделать разделяемый доступ к памяти 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
Go to the top of the page
 
+Quote Post
lamination
сообщение Oct 26 2009, 13:00
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 42
Регистрация: 11-04-06
Пользователь №: 16 019



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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 17:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01339 секунд с 7
ELECTRONIX ©2004-2016