Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Непонятная проблема с Digilent Spartan-3 starter Kit и евойной Ext. SRAM
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Мастер-Ломастер
help.gif
Понадобилось мне задействовать большой объём памяти, больший, нежели чем BlockRAM. На вышеуказанной плате (S3Board) есть два чипа шустрой асинхронной SRAM по 256к 16-битных слов в каждой. Шина адреса запараллелена, шины данных раздельные, управление ножками #WE и #OE запараллелено, ножки #CE, #UB и #LB раздельные.

Всё вроде просто.

Интерфейс модуля, который я использую для работы с этими чипами, примерно такой (опускаю незначительные детали):
Код
...
SRAM_ADDR: out std_logic_vector (17 downto 0);
SRAM_DATA: inout std_logic_vector (15 downto 0);
SRAM_OE: out std_logic;
SRAM_WE: out std_logic;
SRAM_UB: out std_logic;
SRAM_LB: out std_logic;
SRAM_CE: out std_logic;
...
ADDR : in std_logic_vector (17 downto 0);
DATA_READ: out std_logic_vector (15 downto 0);
DATA_WRITE: in std_logic_vector (15 downto 0);
...


На управляющих ножках стоят PULLUP, на адресе и данных для SRAM пробовал ставить и PULLUP, и PULLDOWN, и KEEPER ... впрочем, я чуть забегаю

Когда я делаю вот примерно так:
Код
SRAM_ADDR <= ADDR;
SRAM_OE <= '1';
SRAM_WE <= '0';
SRAM_CE <= '0';
SRAM_LB <= '0';
SRAM_UB <= '0';
SRAM_DATA <= DATA_WRITE;

Смотрю, что появилось на ножках адреса и данных (для отладки, на младшие биты этих шин, повесил светодиоды, через буфер), там всё правильно: установился адрес, есть данные для записи, логические уровни на пинах управления по нулям (там, где надо). Т.е. должен записаться кусок данных в указанную ячейку памяти. Отлаживаюсь чуть ли не в статическом режиме - т.е. несмотря на отсутствие работы с таймингами, всё должно работать (промежутки между подачей и снятием управляющих сигналов просто _гигантские_ по сравнению с теми, что указаны в даташите на чипы памяти).

Далее делаю так:
Код
--SRAM_ADDR <= ADDR; -- адрес не переключаю, на шине - KEEPER
SRAM_OE <= '0';
SRAM_WE <= '1';
SRAM_CE <= '0';
SRAM_LB <= '0';
SRAM_UB <= '0';
DATA_READ <= SRAM_DATA;


Всё вроде замечательно - на выходе DATA_READ модуля появляется то, что я прежде записал.

Но.

Если же я раскомментарю присвоение SRAM_ADDR и поставлю туда какой-нибудь _другой_ адрес - то считается опять то же самое! sad.gif

Т.е. читается не значение из памяти, на которое указывает адрес, а последнее "записанное" значение. Какой бы я адрес не ставил - читается не то, что там должно быть, а то, что было куда-нибудь последним записано.

Я вертел эту схему и так, и сяк, и наперекосяк.
Алгоритм (если это можно назвать алгоритмом) прекрасно работает на BlockRAM, что внутри ПЛИС, но не работает на внешней.

Сначала я думал, что микросхема памяти просто не успевает за ПЛИС (изначально работал на 50 МГц, чипы памяти - 10 нс). Оные чипы грелись, но... Дело оказалось не в этом. Снизив частоту до долей Гц делением, чтобы наблюдать перетикивание светодиодов "вживую", я не добился продвижения в понимании оного глюка. angry.gif

Если поставить PULLUP на выходы SRAM_DATA - читается FFFF. Если поставить PULLDOWN - читается 0000. Если KEEPER - последнее записанное. Уровни на управляющих ножках - правильные. Адрес выставляется. Что ей ещё надо, блин? blink.gif

Пробовал даже делать так:
Код
SRAM_DATA<="ZZ...ZZ";
DATA_READ <= SRAM_DATA;

с тем же результатом (с никаким, т.е.).
  • Может такое быть, что сами микросхемы не работают? Мне кажется, что это очень маловероятно - всё ведь, кроме них, работает прекрасно.
  • Как это проверить другим способом?
  • Кто-нибудь на этой плате вообще внешнюю память использовал?
Перепаивать микросхемы не предлагайте, заменить их не на что (и ОЧЕНЬ не хочется портить плату).
denisys
При работе с двунаправленной внешней шиной данных я явно определяю выходные буферы используя примитив IOBUF, позволяющий управлять двунаправленным пином:
Код
  SRAMDataBus_i : for i in (C_DWIDTH-1) downto 0 generate
     SRAMDataBit_i : iobuf
       port map (
            I  => mem_Data_O(i),
          IO => mem_Data_pin(i),
          O  => mem_Data_I(i),
          T  => mem_Data_T(i)
         );
  end generate;

При этом внутри спартана имеются две шины данных входная и выходная и сигнал переключения буфера.

При таком подходе у меня не возникало проблем с использованием внешней памяти на Spartan-3 starter Kit.
Мастер-Ломастер
Цитата(denisys @ Feb 22 2007, 10:48) *
При работе с двунаправленной внешней шиной данных я явно определяю выходные буферы используя примитив IOBUF


Я прямо щас посмотрел в Technology Schematic - синтезатор от Webpack ISE 9.1i именно эти элементы и поставил. Где шины выходные, там obuf, где входные - ibuf, где вход-выход - iobuf

Кстати, я так тоже делал - в явном виде прописывая двунаправленные буферы. С тем же результатом.
Vovs
Запись в SRAM происходит по переднему фронту WE. Не по уровню. Может адрес меняется позже фронта?
Мастер-Ломастер
Цитата(Vovs @ Feb 23 2007, 10:58) *
Запись в SRAM происходит по переднему фронту WE. Не по уровню. Может адрес меняется позже фронта?


я делал даже так: 4 младших бита адреса вывел на 4 из 8 переключателей, что на плате есть, 4 младших бита данных вывел на оставшиеся 4 переключателя, а стробы WE, CE, OE вывел на кнопки. И перещёлкивал всё вручную.

Т.е. адрес и данные устанавливались за миллионы микросекунд до прихода любых фронтов. Всё с тем же результатом.

===

Есть ли у кого-нибудь рабочий проект для S3Board, чтоб память внешнюю активно юзал? Хотя бы просто убедиться - рабочая она или нет
Мастер-Ломастер
Новости с фронтов.

На сайте Xilinx нашёл референс-дизайны, аккурат к обсуждаемой плате. Один из этих проектов замечательно подошёл к задаче: пикоблейз с уартом, запрограммирован на выполнение команд с терминала - "включить светодиод, выключить светодиод, ... , записать во внешнюю память, считать из внешней памяти".

Проект прекрасно скопмилировался и улёгся в PlatformFlash. И, что интересно, он правильно читает и пишет эту чёртову external SRAM. Т.е. плата - рабочая, всё с ней в порядке.

Далее.

Я сделал FSM, который "по пунктам" реализует обращение на запись к памяти, частота тактовых импульсов - 1 Гц. Т.е. никаких проблем с задержками и т.п. быть не должно.

Первый шаг - "холостой ход", все стробы неактивны (в "1"). Если нажать на одну кнопку, то FSM переходит на второй шаг.

Второй шаг - на шину адреса выставляется нужный адрес, на шину данных - данные для записи (проверял на симуляторе - выставляется. Вообще, выдачу сигналов осуществлял точно так же, как и всегда - присвоением сигнала, который потом "вщёлкивается" в порт В/В или же просто присвоением значения порта В/В). Состояние ножек так же контролировал, подключив к ним светодиоды на плате (подключение внутри ПЛИС, конечно - т.е., по сути, дублирование сигналов)

Третий шаг - стробы CE, LB, UB перещёлкиваются в активное состояние ("0")

Четвёртый шаг - строб WE перещёлкивается в активное состояние ("0")

Пятый шаг - стробы WE, CE, LB, UB возвращаются в неактивное состояние. FSM возвращается в холостой режим.

Прогон на ModelSim показал, что FSM действует именно так, как я это и планировал - все стробы правильо перещёлкиваются, на шинах устанавливается то, что я хочу и процесс записи в SRAM _ДОЛЖЕН_ происходить.

Но НЕ происходит. Перезагрузка платы прошивкой референс-дизайна содержимое внешней SRAM не затрагивает - я это использовал для отладки своей беды.

UCF файл я проверил раз 10, наверное. Для пущщей убедительности, скопировал кусок UCF из референса. Все банки В/В установил в LVCMOS33 (у меня была гипотеза, что SRAM просто уровней не хватает, но гипотеза была отметена, как недостаточно безумная).

Короче говоря, проклятущие микросхемы клали ХУЪ на все мои попытки хотя бы записать что-нибудь...

Что же, чёрт побери, я упустил? blink.gif
Мастер-Ломастер
Кстати, из даташита на эти чипы памяти следует, что чтение можно осуществлять, установив стробы OE, CE, LB и UB в активное состояние, и просто перещёлкивая адреса - через 10 нс после оного перещёлкивания на шине данных должно появляться соответствующее значение.

Я так и делаю, только жду не 10 нс, а намного, намного больше. На шине данных появляется только ZZZZ...

Я не понимаю. Простейшая вещь, но я ковыряюсь с ней уже третью неделю - безрезультатно!
demi
Прошу прощения за вопрос не по теме ......
Хочу купить данную плату. Но возникли некоторые вопросы.Буду признателен, если Вы сможете на них ответить smile.gif
1. Пользовательские разъемы 3х40 полностью отданны разработчику, или нет? В мануале написано, что один из разъемов используется для внешней памяти. Эти пины можно использовать по своему?
2. прилигаются примеры для этой платы в поставке?

Спасибо.
Мастер-Ломастер
Цитата(demi @ Mar 6 2007, 10:55) *
Прошу прощения за вопрос не по теме ......
Хочу купить данную плату. Но возникли некоторые вопросы.Буду признателен, если Вы сможете на них ответить smile.gif
1. Пользовательские разъемы 3х40 полностью отданны разработчику, или нет? В мануале написано, что один из разъемов используется для внешней памяти. Эти пины можно использовать по своему?
2. прилигаются примеры для этой платы в поставке?

Спасибо.


1. часть пинов на одном из разъёмов расшарена с частью пинов микросхем памяти. Использовать параллельно можно, т.к. память неактивна, если нет соответствующих стробов

2. примеры на сайте производителя (Digilent Inc.)
neptune-1
Цитата(Мастер-Ломастер @ Feb 21 2007, 23:43) *
help.gif
Понадобилось мне задействовать большой объём памяти, больший, нежели чем BlockRAM. На вышеуказанной плате (S3Board) есть два чипа шустрой асинхронной SRAM по 256к 16-битных слов в каждой. Шина адреса запараллелена, шины данных раздельные, управление ножками #WE и #OE запараллелено, ножки #CE, #UB и #LB раздельные.

Всё вроде просто.

.....................................

[*]Может такое быть, что сами микросхемы не работают? Мне кажется, что это очень маловероятно - всё ведь, кроме них, работает прекрасно.
[*]Как это проверить другим способом?
[*]Кто-нибудь на этой плате вообще внешнюю память использовал?
[/list]Перепаивать микросхемы не предлагайте, заменить их не на что (и ОЧЕНЬ не хочется портить плату).


Закинь, плиз, все исходники вот сюда: nowhere_land@fromru.com

Мы на своей плате их попробуем запустить. Может, чего и найдем со свежими мозгами.
0xFF
Цитата(Мастер-Ломастер @ Mar 3 2007, 22:35) *
Кстати, из даташита на эти чипы памяти следует, что чтение можно осуществлять, установив стробы OE, CE, LB и UB в активное состояние, и просто перещёлкивая адреса - через 10 нс после оного перещёлкивания на шине данных должно появляться соответствующее значение.

Я так и делаю, только жду не 10 нс, а намного, намного больше. На шине данных появляется только ZZZZ...

Я не понимаю. Простейшая вещь, но я ковыряюсь с ней уже третью неделю - безрезультатно!


Доброго Времени Суток!

В далеком прошлом писал дипломный проект на данной плате. Так называемый "контролер памяти ASRAM" переделал из примера VGA контроллера толи от xilinxа, толи тут же на форуме находил( на Vеrilogе). Если вопрос ещё актуален могу порыть архивы.... Ну а так вообщем ничего не тривиального в работе памяти нет. всё так и должно работать как вы описываете
Цитата
" чтение можно осуществлять, установив стробы OE, CE, LB и UB в активное состояние, и просто перещёлкивая адреса - через 10 нс после оного перещёлкивания на шине данных должно появляться соответствующее значение".
Microwave Engineer
[/quote]Короче говоря, проклятущие микросхемы клали ХУЪ на все мои попытки хотя бы записать что-нибудь... [quote]

И у меня с памятью на Digilent Spartan-3 starter Kit были совершенно идентичные проблемы. Решить их так и не удалось (да не очень-то и надо было). Как же решается эта проблема?
Мастер-Ломастер
Цитата(neptune-1 @ Mar 15 2007, 22:32) *
Мы на своей плате их попробуем запустить. Может, чего и найдем со свежими мозгами.


У вас плата на чём сделана? Spartan3 + SRAM?
Мастер-Ломастер
Цитата(neptune-1 @ Mar 15 2007, 22:32) *
Мы на своей плате их попробуем запустить. Может, чего и найдем со свежими мозгами.


У вас плата на чём сделана? Spartan3 + SRAM?


Цитата(0xFF @ Mar 16 2007, 04:03) *
Если вопрос ещё актуален могу порыть архивы.... Ну а так вообщем ничего не тривиального в работе памяти нет. всё так и должно работать как вы описываете


чем дальше, тем вопрос актуальнее. Я и сам понимаю, что всё должно так работать - и не понимаю, почему не работает sad.gif
neptune-1
Цитата(Мастер-Ломастер @ Mar 20 2007, 00:43) *
У вас плата на чём сделана? Spartan3 + SRAM?


У нас есть Digilent Spartan-3 starter Kit и еще своя плата Spartan3 + SRAM
khach
Попробуйте вот этот http://www.cmosexod.com/sdram.html контроллер. Там дока хорошая, и встроенный тестер есть.
Мастер-Ломастер
Цитата(khach @ Mar 21 2007, 16:10) *
Попробуйте вот этот http://www.cmosexod.com/sdram.html контроллер. Там дока хорошая, и встроенный тестер есть.


у меня SRAM на плате, а не SDRAM,..
Artem_Petrik
Действительно странные проблемы на ровном месте. У самого в самом первом проекте на FPGA стояла SRAM, и с чем только проблем не было, но только не с ней.
Наверняка дело не в этом, (раз все просматривается пошагово на железе)но все же: Когда я только начинал разбираться с реализацией двунаправленных шин на верилоге, у меня была схожая проблема - при переводе пина на вход, он как положено переводился в Z состояние, но читалось с него чертий что. Проблема была в неправильном использовании блокирующих и неблокирующих присваиваний. Но это обнаружилось еще при моделировании.
Ну и еще: может пины сконфигурированы не в тот стандарт? Конечно совсем бред, но мало-ли. Микруха тогда может не видеть ноль или еденицу, и соответственно работать неправильно. Опять же было и такое раз, Кто там на осциллографе смотрит какой высоты импульсы - можно и не заметить, что они низковаты, или там ноль на вольт над землей поднят.

Кроме того вот здесь:
[code]
--SRAM_ADDR <= ADDR; -- адрес не переключаю, на шине - KEEPER
SRAM_OE <= '0';
SRAM_WE <= '1';
SRAM_CE <= '0';
SRAM_LB <= '0';
SRAM_UB <= '0';
DATA_READ <= SRAM_DATA;
[\code]
смущает то что все записано подряд, тоесть одновременно, в то время как "DATA_READ <= SRAM_DATA;" должно быть в следующем такте, т.е через некоторое время.
Мастер-Ломастер
Цитата(Artem_Petrik @ Mar 25 2007, 20:53) *
Проблема была в неправильном использовании блокирующих и неблокирующих присваиваний.

чуть-чуть раскрыть тему можно?


Цитата(Artem_Petrik @ Mar 25 2007, 20:53) *
Кроме того вот здесь:
[code]
--SRAM_ADDR <= ADDR; -- адрес не переключаю, на шине - KEEPER
SRAM_OE <= '0';
SRAM_WE <= '1';
SRAM_CE <= '0';
SRAM_LB <= '0';
SRAM_UB <= '0';
DATA_READ <= SRAM_DATA;
[\code]
смущает то что все записано подряд, тоесть одновременно, в то время как "DATA_READ <= SRAM_DATA;" должно быть в следующем такте, т.е через некоторое время.

вы не поверите, но я делал даже не просто "через некоторое время", а через секунды. Вот разве что в реализации двунаправленной шины какой-то косяк
Artem_Petrik
Цитата
чуть-чуть раскрыть тему можно?

Проблема была, если мне не изменяет память, в том, что при расположенных подряд
Код
data = 'bZ;
read_data = data;

в read_data (в симуляторе) попадало Z а не значение, установленное на ногу извне. После замены присваиваний на "<=" проблема пропала. Правда понятия не имею, как этот глюк будет проявляться в железе. Еще раз отмечу - у меня verilog.

У меня есть плата с циклоном и срамом. Попробую на верилоге набросать тупенький тестовый проект, типа записать разные значения в три адреса подряд, а потом прочитать первый, и дать вам на растерзание. Правда сильно быстро не обещаю, на этой неделе нужно кровь из носа одну вещь доделать. Но постараюсь побыстрее.
Artem_Petrik
Вобщем вот такой нехитрый код у меня в железе работает:
Код
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;

ENTITY vhdl_sram IS
    PORT
    (
        clk        : IN    STD_LOGIC;
        rst        : IN    STD_LOGIC;
        -- Сигналы для SRAM
        address    : OUT    STD_LOGIC_VECTOR(16 downto 0);
        data    : INOUT    STD_LOGIC_VECTOR(7 downto 0);
        oe_n    : OUT    STD_LOGIC;
        ce_n    : OUT    STD_LOGIC;
        we_n    : OUT    STD_LOGIC;
        -- Считанное назад значение
        readed_data    : OUT    STD_LOGIC_VECTOR(7 downto 0)
    );
END vhdl_sram;

ARCHITECTURE rtl OF vhdl_sram IS
    TYPE state_type IS (state1, state2, state3);
    SIGNAL state: state_type;
    
    --SIGNAL    cnt    : UNSIGNED(4 DOWNTO 0);
    SIGNAL    cnt    : INTEGER RANGE 0 TO 31;
BEGIN

    PROCESS (clk, rst)
    BEGIN
        IF rst='1' THEN
            cnt <= 0;
        ELSIF (clk'EVENT AND clk = '1') THEN
            cnt <= cnt + 1;
        END IF;
    END PROCESS;
    
    PROCESS (clk, rst)
    BEGIN
        IF (rst='1') THEN
                    address <= B"0_0000_0000_0000_0000";
                    data <= (others => 'Z');
                    ce_n <= '1';
                    oe_n <= '1';
                    we_n <= '1';
                    readed_data <= B"0000_0000";
        ELSIF (clk'EVENT AND clk = '1') THEN
            CASE cnt IS
                WHEN 0 =>
                    address <= B"0_0000_0000_0000_0000";
                    data <= B"0110_1010";
                    ce_n <= '1';
                    oe_n <= '1';
                    we_n <= '1';
                    
                WHEN 1 =>
                    ce_n <= '0';
                    we_n <= '0';
                    
                WHEN 2 =>
                    ce_n <= '1';
                    we_n <= '1';
                    
                WHEN 3 =>
                    address <= B"0_0000_0000_0000_0001";
                    data <= B"1100_0101";
                    
                WHEN 4 =>
                    ce_n <= '0';
                    we_n <= '0';

                WHEN 5 =>
                    ce_n <= '1';
                    we_n <= '1';
                    
                WHEN 6 =>
                    address <= B"0_0000_0000_0000_0000";
                    data <= (others => 'Z');
                
                WHEN 7 =>
                    ce_n <= '0';
                    oe_n <= '0';
                    
                WHEN 15 =>
                    readed_data <= data;
                    
                WHEN 16 =>
                    ce_n <= '1';
                    oe_n <= '1';
                    
                WHEN OTHERS => NULL;
                    
            END CASE;
        END IF;
    END PROCESS;
END rtl;


Пока писал - выяснил для себя, что ничего я в VHDL не понимаю smile.gif , так что за красоту не ругайте.
У меня микруха 8битная, недостающие сигналы добавите сами, либо вообще можно выдать на них нули навсегда (кроме шины данных естественно). Здесь все циклически повторяется, с задержкой между повторениями, для того, чтобы было наиболее удобно смотреть сигналы осциллографом. Смотреть желательно прямо на ногах SRAM (впрочем к шарикам подлезть трудно, так что замечание лишнее). Заодно обратить внимание на уровни нулей и едениц. Ноги сконфигурить как 3,3V CMOS. Я на шину данных пуллапов/басхолдов не ставил. Если все выдаваемые плисой сигналы в порядке, но ОЗУ все равно ничего не выдает - остается только предпологать неисправность микросхемы SRAM, и, по возможности, заменить ее на заведомо исправную. В частности, если поначалу, по каким-то причинам, при чтении из озу FPGA не переводила шину данных в Z состояние, то
Цитата
Оные чипы грелись, но...

могло быть вызвано вовсе не 50МГц-ами, и привести к выходу микросхем из строя. Эта микруха при Fmax ест порядка 100ма, так что при 50Мгц по идее особо грется не должна. Впрочем "грелись" - понятие растяжимое.

Надеюсь моя нехитрая помощь поможет победить эту неприятную проблему.
Мастер-Ломастер
Цитата(Artem_Petrik @ Mar 31 2007, 19:48) *
Если все выдаваемые плисой сигналы в порядке, но ОЗУ все равно ничего не выдает - остается только предпологать неисправность микросхемы SRAM


микросхемы исправны, я проверил при помощи s3_board_monitor - обе пишутся/читаются. По крайней мере, по тем адресам, что я проверял - сам "монитор" управляется вручную, поэтому я провериол только несколько первых адресов. Так что с чипами всё ok (и с ПЛИС тоже).

Но и мой вариант, и ваш - не работают. angry.gif

Оба ничего не пишут и читают ахинею.

У меня была безумная гипотеза: в .UCF неверно прописаны ножки управляющих стробов. Проверил-перепроверил, а потом вовсе скопировал из вышеупомянутого "монитора" кусок UCF-файла.

Не помогло.

Чипы, как я уже сказал, действительно греются - хоть какая-то реакция glare.gif

Осцилла дома нету, проверить эпюры нечем - я основываюсь на показаниях всё того же "монитора" и дополнительно ещё использую LED-индикатор, что на плате установлен.

Делаю так: запускаю прошивку, которая должна (хехе) прописать по первым четырём адресам разные константы, затем перегружаю плату и запускаю "монитор", чтобы посмотреть, что изменилось в SRAM. А там - ничего не изменилось, кроме ячеек с нулевыми адресами (но, видимо, это уже сам монитор их портит).

Чем дальше, тем меньше понимаю, что там происходит sad.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.