Перейти к содержанию
    

MAXII + SRAM

К EPM570 подключены три внешние шины адреса ARA,ARB,AWA, одна шина данных DW и внешняя SRAM со своими шинами адреса, данных и управления WRRAM,OERAM.

 

Нужно циклически выполнять следующее:

 

1. прочитать содержимое SRAM по адресу ARA и выдать на пины DA

2. прочитать содержимое SRAM по адресу ARB и выдать на пины DB

3. состояние на шине DW записать по адресу AWA.

 

Всё это нужно сделать за три такта входной частоты 100 MHz.

 

Нарисовал схему в граф редакторе.

А в симуляторе вижу что это работать точно не будет.

Шина адреса sram (ARAM) пляшет во время переключения.

Сигналы OERAM и WRRAM имеют разную задержку.

Задний фронт WRRAM вообще появляется на пине позже чем переключается шина данных DRAM на ввод.

 

Посоветуйте что исправить. Или вообще всё переделать.

Время доступа SRAM 8 нс.

post-40106-1443462481_thumb.jpg

post-40106-1443462499_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К EPM570 подключены три внешние шины адреса ARA,ARB,AWA, одна шина данных DW и внешняя SRAM со своими шинами адреса, данных и управления WRRAM,OERAM.

 

Нужно циклически выполнять следующее:

 

1. прочитать содержимое SRAM по адресу ARA и выдать на пины DA

2. прочитать содержимое SRAM по адресу ARB и выдать на пины DB

3. состояние на шине DW записать по адресу AWA.

 

Всё это нужно сделать за три такта входной частоты 100 MHz.

 

Нарисовал схему в граф редакторе.

А в симуляторе вижу что это работать точно не будет.

Шина адреса sram (ARAM) пляшет во время переключения.

Сигналы OERAM и WRRAM имеют разную задержку.

Задний фронт WRRAM вообще появляется на пине позже чем переключается шина данных DRAM на ввод.

 

Посоветуйте что исправить. Или вообще всё передать.

Время доступа SRAM 8 нс.

Абсолютно справедливо-работать не будет. Задержка между клоком и данными на выход 6... 10 нс, задержка в памяти 8 нс, задержка на вход 3... 5 нс. Итого, для чтения нужно минимум 3 такта на один адрес. И это если разводка точка-точка и на шине только ОЗУ. Для записи приблизительно 5 из похожих соображений. Нужна стейт машина для фиксации нахождения в режиме и куча флагов типа готов-поехали-принял. Иначе никак.

Изменено пользователем Corner

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может шина адреса одну, с выбором чипа. По переднему фронту CLK выставляешь адрес с выбором чипа, по заднему фронту считываешь данные

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...Итого, для чтения нужно минимум 3 такта на один адрес.

Спасибо. Понятно. Думал за 1 такт можно ухитриться, но видать нет (

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо. Понятно. Думал за 1 такт можно ухитриться, но видать нет (

Попытка - не пытка.

post-17402-1443509406_thumb.jpg

module sram
#(    parameter wdata = 8,
    parameter waddr = 10    )
(    input clk,
    input    [waddr-1:0]    ara_i, arb_i, awa_i,
    input    [wdata-1:0] dw_i,
    output    reg    [wdata-1:0]    da_or, db_or,
    inout    [wdata-1:0]    dram_io,
    output    reg    [waddr-1:0]    aram_or,
    output    oeram_o,
    output    wram_o,
    output    reg    dataready_or
);
    assign    oeram_o = 0;
    assign    dram_io = (we_r ? rwram : {waddr{1'bz}});
    assign    wram_o = (we_r ? ~clk | wramag_r : 1'b1);

    reg    [wdata-1:0] rwram;
    reg    we_r;
    reg    wramag_r;
    reg    [1:0]    stage_r;
    
    always @ (posedge clk)
        begin
        if (stage_r == 2'b10)    stage_r <= 0;
        else    stage_r <= stage_r + 1;
        
        case    (stage_r)
            2'b00:    begin
                    aram_or <= ara_i;
                    we_r <= 0;
                    dataready_or <= 0;
                    end
            2'b01:    begin
                    aram_or <= arb_i;
                    da_or <= dram_io;
                    rwram <= dw_i;
                    end
            2'b10:    begin
                    aram_or    <= awa_i;
                    db_or <= dram_io;
                    we_r <= 1;
                    dataready_or <= 1;
                    end
        endcase
        end    
        
    always    @ (negedge clk)
        begin
        if (stage_r == 0)    wramag_r <= 1; // это нужно, чтобы избавиться от глитча при возврате из режима записи (см. формирование wram_o)
        else    wramag_r <= 0;
        end
endmodule

С времянками, конечно, получается вольно и лишь бы сама ОЗУшка успевала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попытка - не пытка.

 

Спасибо. В языках не силён (.

Если бы это в виде блок-схемы изобразить.

Может кто то помочь?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Создайте графический символ этому файлу и вставьте в свой проект. Может, ещё и не заработает. Чего зря рисовать то?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Создайте графический символ этому файлу и вставьте в свой проект. Может, ещё и не заработает. Чего зря рисовать то?

Сделал. Все вроде работает но на чипе с speed grade 4.

Понятно что для speed grade 5 тактовую понижать нужно.

 

    always    @ (negedge clk)
        begin
        if (stage_r == 0)    wramag_r <= 1; // это нужно, чтобы избавиться от глитча при возврате из режима записи (см. формирование wram_o)
        else    wramag_r <= 0;
        end

Подскажите вот это как в граф редакторе на триггере реализовать?

Так как на прикреплённой картинке или как то иначе?

post-40106-1443542273_thumb.jpg

post-40106-1443542278_thumb.jpg

post-40106-1443542460_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вы можете код синтезнуть, а потом в технологик схем вьювере поглядеть как оно реализуется, на каких элементах и как соединено%)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

    always    @ (negedge clk)
         begin
         if (stage_r == 0)    wramag_r <= 1; // это нужно, чтобы избавиться от глитча при возврате из режима записи (см. формирование wram_o)
         else    wramag_r <= 0;
         end

Подскажите вот это как в граф редакторе на триггере реализовать?

Фактически, здесь написано: всегда при отрицательном фронте clk присваивать wramag=1, если stage равен 0 и, если иначе, то обнулять этот wramag.

Так и делаем:

1. инвертируем clk (надо же по отрицательному фронту защёлкивать) и подаём на тактовый вход DFF

2. биты stage заводим на ИЛИ-НЕ и подаём на вход данных D

3. защёлкивам в DFF

4. снимаем результат с Q

post-17402-1443602365_thumb.jpg

p.s. А зачем Вам манипуляции с OE и CS? Если используется один чип памяти и его порты работают через ПЛИС, то пусть по умолчанию всегда будет выбран и всегда в режиме выдачи данных с текущего адреса. Ему (чипу ОЗУ) всё равно, а Вам - экономия ресурсов на ПЛИСке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...