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

 
 
> ПЛИС + 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
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 18)
%-)
сообщение Dec 1 2009, 13:47
Сообщение #16


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

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



я в стадии крайнего офонарения!!!

простейший автомат с 2-мя состояниями не работает!!!

Он должен писать значения в регистры, когда A=0,WE=0, CS=0

Clk=50MHz, ширина WE=10MHz, остальные ещё меньше по частоте


помогите плиз...

Код
process(Clk)
begin
if rising_edge(Clk) then
   if State='0' then
    if Port_CS='0' and Port_A='0' and Port_WE='0' then
     case Port_D(15 downto 12) is
      when "0010" =>
       if VBlank='0' then                                 --0x2000|P
        R_P<=Port_D(0);
       end if;
      when "0011" =>                                 --0x3000|X0
       R_X0<=Port_D(8 downto 0);
      when "0100" =>                                 --0x4000|X1
       R_X1<=Port_D(8 downto 0);
      when "0101" =>                                 --0x5000|Y0
       R_Y0<=Port_D(7 downto 0);
      when "0110" =>                                 --0x6000|Y1
       R_Y1<=Port_D(7 downto 0);
      when others =>null;
     end case;
     State<='1';
    end if;
   else
    if Port_WE='1' then
     State<='0';
    end if;
   end if;
end if;
end process;
Go to the top of the page
 
+Quote Post
%-)
сообщение Dec 7 2009, 02:06
Сообщение #17


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

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



сделал синхронную нарезку от внешнего кварцевого генератора 50мгц

автомат дышит, но по-прежнему иногда ложно срабатывают регистры.

Код
process(Clk)
begin
if rising_edge(Clk) then
  CE<=Port_CE;
  WE<=Port_WE;
  A<=Port_A;
  D<=Port_D;
end if;
end if;

process(Clk)
begin
if rising_edge(Clk) then
  if State='0' then
   if CE='0' and WE='0' then
    if A='0' then --запись в регистры
     case D(15 downto 12) is
      when "0000" =>
       Register0<=D(7 downto 0);
. . .
      when "0111" =>
       Register7<=D(7 downto 0);
     end case;
    else --увеличение адреса
     WriteAddr<=WriteAddr+1;
    end if;
    State<='1'; --следующее состояние - дождёмся завершения передачи
   end if;
  else
   if CS='0' and WE='1' then
    State<='0';
   end if;
  end if;
end if;
end process;    

process(Clk)
begin
if rising_edge(Clk) then
  SRAM_CE<=CE;
  SRAM_WE<=WE;
  SRAM_A<=WriteAddr;
  SRAM_D<=D;
end if;
end process;


Это позволило исключить ложные записи в память, но регистры глючат - к ним не обращаются, а они срабатывают

Чего ещё не хватает в коде? 1111493779.gif
Go to the top of the page
 
+Quote Post
des00
сообщение Dec 7 2009, 04:23
Сообщение #18


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(%-) @ Dec 6 2009, 20:06) *
сделал синхронную нарезку от внешнего кварцевого генератора 50мгц


для шины на 133МГц ? как то слишком оптимистично, ИМХО при ваших tsu/twr/th надо не менее 100МГц

Цитата
автомат дышит, но по-прежнему иногда ложно срабатывают регистры.
Это позволило исключить ложные записи в память, но регистры глючат - к ним не обращаются, а они срабатывают


я бы привязывался не к уровню сигнала we, а при th = 1 к его заднему фронту


--------------------
Go to the top of the page
 
+Quote Post
%-)
сообщение Dec 7 2009, 05:08
Сообщение #19


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

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



Цитата(des00 @ Dec 7 2009, 08:23) *
для шины на 133МГц ? как то слишком оптимистично, ИМХО при ваших tsu/twr/th надо не менее 100МГц


Сорри, забыл написать - что клок 50мгц с кварцевого генератора. Времянки записи растянуты так чтоб угодить в очко:

Tsetup=133mhz/4=33 MHz 4clk
Twrite=133/4=33 MHz 4clk
Thold=0

Цитата(des00 @ Dec 7 2009, 08:23) *
я бы привязывался не к уровню сигнала we, а при th = 1 к его заднему фронту


объясните пожалуйста подробно, о чём речь идёт - о записи в регистр или увеличении адреса памяти?

мне ещё писали что нарезать данные и адрес не надо. Только CS и WE. так?


прошу обсудить такой вариант с задним фронтом и без нарезки address/data:

THold=3clk 133/3=44.3 МГц
TWrite=4 clk =33.3 МГц
Tsetup=1clk (сделать =0clk невозможно - времянка BF533)

Код
--CLK=50MHz

process(Clk)
begin
if rising_edge(Clk) then
  CE<=Port_CE;
  WE<=Port_WE;
  A<=Port_A;
end if;
end if;

process(WE)
begin
if rising_edge(WE) then --запись по заднему фронту
   if CE='0' then
    if A='0' then --запись в регистры
     case Port_D(15 downto 12) is
      when "0000" =>
       Register0<=D(7 downto 0);
. . .
      when "0111" =>
       Register7<=D(7 downto 0);
     end case;
    else --увеличение адреса
     WriteAddr<=WriteAddr+1;
    end if;
   end if;
  end if;
end process;    

--просто без нарезки, так как CE, WE - уже нарезаны
  SRAM_CE<=CE;
  SRAM_WE<=WE;
  SRAM_A<=WriteAddr;
  SRAM_D<=D;


Сообщение отредактировал %-) - Dec 7 2009, 05:38
Go to the top of the page
 
+Quote Post

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

 


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


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