|
|
  |
MAXII + SRAM, Помогите реализовать |
|
|
|
Sep 28 2015, 17:48
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
К 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 нс.
Эскизы прикрепленных изображений
|
|
|
|
|
Sep 28 2015, 19:19
|

Профессионал
    
Группа: Участник
Сообщений: 1 072
Регистрация: 11-12-12
Пользователь №: 74 815

|
Цитата(zombi @ Sep 28 2015, 21:48)  К 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 - Sep 28 2015, 19:19
|
|
|
|
|
Sep 29 2015, 06:51
|

Знающий
   
Группа: Свой
Сообщений: 597
Регистрация: 24-05-06
Из: г. Чебоксары
Пользователь №: 17 402

|
Цитата(zombi @ Sep 29 2015, 02:18)  Спасибо. Понятно. Думал за 1 такт можно ухитриться, но видать нет ( Попытка - не пытка.
Код 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 С времянками, конечно, получается вольно и лишь бы сама ОЗУшка успевала.
--------------------
Почему разработчики систем повышенной надёжности плохо справляются с простыми проектами? :)
|
|
|
|
|
Sep 29 2015, 16:01
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(EvgenyNik @ Sep 29 2015, 12:12)  Создайте графический символ этому файлу и вставьте в свой проект. Может, ещё и не заработает. Чего зря рисовать то? Сделал. Все вроде работает но на чипе с speed grade 4. Понятно что для speed grade 5 тактовую понижать нужно. Код always @ (negedge clk) begin if (stage_r == 0) wramag_r <= 1; // это нужно, чтобы избавиться от глитча при возврате из режима записи (см. формирование wram_o) else wramag_r <= 0; end Подскажите вот это как в граф редакторе на триггере реализовать? Так как на прикреплённой картинке или как то иначе?
Эскизы прикрепленных изображений
|
|
|
|
|
Sep 30 2015, 08:39
|

Знающий
   
Группа: Свой
Сообщений: 597
Регистрация: 24-05-06
Из: г. Чебоксары
Пользователь №: 17 402

|
Цитата(zombi @ Sep 29 2015, 19:01)  Код 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
p.s. А зачем Вам манипуляции с OE и CS? Если используется один чип памяти и его порты работают через ПЛИС, то пусть по умолчанию всегда будет выбран и всегда в режиме выдачи данных с текущего адреса. Ему (чипу ОЗУ) всё равно, а Вам - экономия ресурсов на ПЛИСке.
--------------------
Почему разработчики систем повышенной надёжности плохо справляются с простыми проектами? :)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|