zombi 0 28 сентября, 2015 Опубликовано 28 сентября, 2015 · Жалоба К 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 нс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Corner 0 28 сентября, 2015 Опубликовано 28 сентября, 2015 (изменено) · Жалоба К 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 из похожих соображений. Нужна стейт машина для фиксации нахождения в режиме и куча флагов типа готов-поехали-принял. Иначе никак. Изменено 28 сентября, 2015 пользователем Corner Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khlenar 5 28 сентября, 2015 Опубликовано 28 сентября, 2015 · Жалоба Может шина адреса одну, с выбором чипа. По переднему фронту CLK выставляешь адрес с выбором чипа, по заднему фронту считываешь данные Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 28 сентября, 2015 Опубликовано 28 сентября, 2015 · Жалоба ...Итого, для чтения нужно минимум 3 такта на один адрес. Спасибо. Понятно. Думал за 1 такт можно ухитриться, но видать нет ( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EvgenyNik 0 29 сентября, 2015 Опубликовано 29 сентября, 2015 · Жалоба Спасибо. Понятно. Думал за 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 С времянками, конечно, получается вольно и лишь бы сама ОЗУшка успевала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 29 сентября, 2015 Опубликовано 29 сентября, 2015 · Жалоба Попытка - не пытка. Спасибо. В языках не силён (. Если бы это в виде блок-схемы изобразить. Может кто то помочь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EvgenyNik 0 29 сентября, 2015 Опубликовано 29 сентября, 2015 · Жалоба Создайте графический символ этому файлу и вставьте в свой проект. Может, ещё и не заработает. Чего зря рисовать то? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 29 сентября, 2015 Опубликовано 29 сентября, 2015 · Жалоба Создайте графический символ этому файлу и вставьте в свой проект. Может, ещё и не заработает. Чего зря рисовать то? Сделал. Все вроде работает но на чипе с speed grade 4. Понятно что для speed grade 5 тактовую понижать нужно. always @ (negedge clk) begin if (stage_r == 0) wramag_r <= 1; // это нужно, чтобы избавиться от глитча при возврате из режима записи (см. формирование wram_o) else wramag_r <= 0; end Подскажите вот это как в граф редакторе на триггере реализовать? Так как на прикреплённой картинке или как то иначе? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 29 сентября, 2015 Опубликовано 29 сентября, 2015 · Жалоба вы можете код синтезнуть, а потом в технологик схем вьювере поглядеть как оно реализуется, на каких элементах и как соединено%) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EvgenyNik 0 30 сентября, 2015 Опубликовано 30 сентября, 2015 · Жалоба 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? Если используется один чип памяти и его порты работают через ПЛИС, то пусть по умолчанию всегда будет выбран и всегда в режиме выдачи данных с текущего адреса. Ему (чипу ОЗУ) всё равно, а Вам - экономия ресурсов на ПЛИСке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться