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

 
 
> Непонятная проблема с Digilent Spartan-3 starter Kit и евойной Ext. SRAM, То ли не пишет, то ли не читает... Ай нид ХЕЕЕЛП!!!
Мастер-Ломастер
сообщение Feb 21 2007, 23:43
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 24-01-07
Пользователь №: 24 706



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;

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

Сообщение отредактировал Мастер-Ломастер - Feb 22 2007, 00:25
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Artem_Petrik
сообщение Mar 31 2007, 19:48
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



Вобщем вот такой нехитрый код у меня в железе работает:
Код
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Мгц по идее особо грется не должна. Впрочем "грелись" - понятие растяжимое.

Надеюсь моя нехитрая помощь поможет победить эту неприятную проблему.
Go to the top of the page
 
+Quote Post
Мастер-Ломастер
сообщение Apr 4 2007, 22:49
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 24-01-07
Пользователь №: 24 706



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


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

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

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

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

Не помогло.

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

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

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

Чем дальше, тем меньше понимаю, что там происходит sad.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Мастер-Ломастер   Непонятная проблема с Digilent Spartan-3 starter Kit и евойной Ext. SRAM   Feb 21 2007, 23:43
- - denisys   При работе с двунаправленной внешней шиной данных ...   Feb 22 2007, 10:48
|- - Мастер-Ломастер   Цитата(denisys @ Feb 22 2007, 10:48) При ...   Feb 22 2007, 16:29
- - Vovs   Запись в SRAM происходит по переднему фронту WE. Н...   Feb 23 2007, 10:58
|- - Мастер-Ломастер   Цитата(Vovs @ Feb 23 2007, 10:58) Запись ...   Feb 26 2007, 12:08
- - Мастер-Ломастер   Новости с фронтов. На сайте Xilinx нашёл референс...   Feb 28 2007, 21:27
- - Мастер-Ломастер   Кстати, из даташита на эти чипы памяти следует, чт...   Mar 3 2007, 21:35
|- - 0xFF   Цитата(Мастер-Ломастер @ Mar 3 2007, 22...   Mar 16 2007, 04:03
- - demi   Прошу прощения за вопрос не по теме ...... Хочу ку...   Mar 6 2007, 10:55
|- - Мастер-Ломастер   Цитата(demi @ Mar 6 2007, 10:55) Прошу пр...   Mar 6 2007, 18:24
- - neptune-1   Цитата(Мастер-Ломастер @ Feb 21 2007, 23...   Mar 15 2007, 22:32
|- - Мастер-Ломастер   Цитата(neptune-1 @ Mar 15 2007, 22:3...   Mar 20 2007, 00:43
||- - neptune-1   Цитата(Мастер-Ломастер @ Mar 20 2007, 00...   Mar 20 2007, 14:25
|- - Мастер-Ломастер   Цитата(neptune-1 @ Mar 15 2007, 22:3...   Mar 20 2007, 00:45
- - Microwave Engineer   [/quote]Короче говоря, проклятущие микросхемы клал...   Mar 19 2007, 14:22
- - khach   Попробуйте вот этот http://www.cmosexod.com/sdram....   Mar 21 2007, 16:10
|- - Мастер-Ломастер   Цитата(khach @ Mar 21 2007, 16:10) Попроб...   Mar 21 2007, 19:26
- - Artem_Petrik   Действительно странные проблемы на ровном месте. У...   Mar 25 2007, 20:53
|- - Мастер-Ломастер   Цитата(Artem_Petrik @ Mar 25 2007, 20:53)...   Mar 28 2007, 02:17
- - Artem_Petrik   Цитатачуть-чуть раскрыть тему можно? Проблема была...   Mar 29 2007, 19:50


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

 


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


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