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

 
 
> ПЛИС + SRAM, посоветуйте
%-)
сообщение Nov 27 2009, 00:49
Сообщение #1


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

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



есть порт для ввода данных из хост-процессора в ПЛИС (запись в ПЛИС)

к ПЛИС подключена SRAM

нужно организовать запись в SRAM через ПЛИС.
при этом адрес на память выставляет сама ПЛИС.

сделано вот так:

Код
SRAM_D<=Port_D;      --линии данных порта ПЛИС соединяем с линиями данных SRAM
SRAM_A<=Address;    --линии адреса SRAM соединены со счётчиком ПЛИС
SRAM_CS<=Port_CS;  --линия выбора SRAM соединена с линией порта ПЛИС
SRAM_OE<='1';          --чтение не используется
SRAM0_WE<=Port_WE; --линия разрешения записи SRAM соединена с линией порта ПЛИС

process(Port_WE) --увеличение адреса на 1
begin
if falling_edge(Port_WE) then
  if Port_CS='0' then
   if Address=1000 then
    Address<=(others => '0');
   else
    Address<=Address+1;
   end if;
  end if;
end if;
end process;


По времянкам.

Tsetup=20нс
Thold=20нс
Twrite=20нс

Тем не менее, в силу каких-то обстоятельств(возможно когда на линии данных 0xFFFF) ИНОГДА происходит пропуск увеличения адреса - он как бы тот же.

Прошу покритиковать и обсудить код. А также причины, вызвавшие сей эффект

Сообщение отредактировал %-) - Nov 27 2009, 01:24
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
BSV
сообщение Nov 27 2009, 05:08
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 541
Регистрация: 11-04-05
Из: Москва
Пользователь №: 4 045



Нужно в каждом цикле обращения выполнять операции с памятью по ТЕКУЩЕМУ адресу, а инкрементировать его ПОСЛЕ выполнения операции. Это обычная практика, тогда не будет проблем со времянками.
P.S. В Вашей теме про ПЛИС и процессор я уже писал, что запись по спаду строба записи - это неправильно, но Вы упорно продолжаете это делать...


--------------------
Дурак, занимающий высокий пост, подобен человеку на вершине горы - все ему кажется маленьким, а всем остальным кажется маленьким он сам. /Законы Мерфи/
Go to the top of the page
 
+Quote Post
%-)
сообщение Nov 27 2009, 06:14
Сообщение #3


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

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



Цитата(BSV @ Nov 27 2009, 08:08) *
Нужно в каждом цикле обращения выполнять операции с памятью по ТЕКУЩЕМУ адресу, а инкрементировать его ПОСЛЕ выполнения операции. Это обычная практика, тогда не будет проблем со времянками.
P.S. В Вашей теме про ПЛИС и процессор я уже писал, что запись по спаду строба записи - это неправильно, но Вы упорно продолжаете это делать...


ваш пример:

Код
process(AWEn)
begin
  if (AWEn'event and AWEn = '1') then
    if (CS='0' and A='0' and  D(15 downto 12) = "0101") then
      Y<=D(7 downto 0);
    end if;
    ...
  end if;
end process;


всё хорошо, но есть неуверенность, что в момент подымания AWE будет актуален A (возможно он изменится)

кстати, когда CS=1, то каким будет сигнал на линии A (адрес со стороны процессора) - последний или Z-состояние?

ниже времянка той памяти с которой идёт работа.

в момент поднятия WE, данные ещё актуальны. тогда какое мы имеем право изменять адрес во время фронта WE ? (rising edge?)

ведь он уже должен быть стабилен и актуален до поднятия CS.

прошу разъяснить если заблуждаюсь.

P.S. вот ещё что надумалось.

можно увеличивать адрес по rising_edge(CS). Приемущество в том что память защищена от записи в этот момент (Thold>0, WE=1)

исправил процесс. позже потестирую

Код
process(Port_CS,Port_A,Port_WE)
begin
--Register CS=0,WE=0
if Port_CS='0' then
  if Port_WE='0' then
   case Port_D(15 downto 12) is
    when "1000" =>
     R_M:=Port_D(2 downto 0);
    when "1001" =>
     if VBlank='0' then
      R_P:=Port_D(0);
     end if;
    when "1010" =>
     R_W:=Port_D(8 downto 0);
     W2:='0'&R_W(8 downto 1);
     X0:="010100000"-W2;
     X1:="010011111"+W2;
     X:=X0;
    when "1011" =>
     R_H:=Port_D(7 downto 0);
     H2:='0'&R_H(7 downto 1);
     Y0:="01111000"-H2;
     Y1:="01110111"+H2;
     Y:=Y0;
    when others =>
     null;
   end case;
  end if;
else
--VideoRAM CS=1,A ---|___
  if rising_edge(Port_A) then
   if X=X1 then
    X:=X0;
    if Y=Y1 then
     Y:=Y0;
    else
     Y:=Y+1;
    end if;
   else
    X:=X+1;
   end if;
   WriteAddress<=("101000000"*Y)+X;
  end if;  
end if;
end process;


в vhdl-коде решил Port_A превратить в CS для данных.

тоесть:

Port_CS=0 - разрешение пиать в регистры
Port_A=0 - разрешение увеличивать адрес памяти
Port_WE - разрешение записи (общий)

Сообщение отредактировал %-) - Nov 27 2009, 06:17
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- %-)   ПЛИС + SRAM   Nov 27 2009, 00:49
- - Builder   Цитата(%-) @ Nov 27 2009, 04:49)...   Nov 27 2009, 02:22
|- - %-)   Цитата(Builder @ Nov 27 2009, 05:22) Врем...   Nov 27 2009, 03:25
|- - Builder   Цитата(%-) @ Nov 27 2009, 06:25)...   Nov 27 2009, 08:15
- - sazh   Цитата(%-) @ Nov 27 2009, 03:49)...   Nov 27 2009, 06:56
- - %-)   проблема почти выявлена. инкремент адреса иногда ...   Nov 27 2009, 09:02
|- - des00   Цитата(%-) @ Nov 27 2009, 03:02)...   Nov 28 2009, 10:01
|- - alevnew   Цитата(%-) @ Nov 27 2009, 15:02)...   Dec 1 2009, 07:06
|- - %-)   Цитата(alevnew @ Dec 1 2009, 11:06) По мо...   Dec 1 2009, 07:11
|- - sazh   Цитата(%-) @ Dec 1 2009, 10:11) ...   Dec 1 2009, 12:02
- - %-)   значит так. 1) буфер чисто на данные ставить нель...   Nov 29 2009, 04:25
|- - sazh   Цитата(%-) @ Nov 29 2009, 07:25)...   Nov 29 2009, 09:28
- - %-)   Решил вникнуть в синхронный дизайн и сделать обраб...   Dec 1 2009, 02:28
- - %-)   я в стадии крайнего офонарения!!! про...   Dec 1 2009, 13:47
- - %-)   сделал синхронную нарезку от внешнего кварцевого г...   Dec 7 2009, 02:06
- - des00   Цитата(%-) @ Dec 6 2009, 20:06) ...   Dec 7 2009, 04:23
- - %-)   Цитата(des00 @ Dec 7 2009, 08:23) для шин...   Dec 7 2009, 05:08


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 06:16
Рейтинг@Mail.ru


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