srf55 2 28 апреля, 2023 Опубликовано 28 апреля, 2023 (изменено) · Жалоба Добрый день! Я пытаюсь собрать тестовый проект в Quartus II 9.0 для микросхемы EPF10K50RI240 (Семейство FLEX10K). Проект содержит только модуль Single Port RAM на языке Verilog, взятый из встроенных шаблонов (Templates). Спойлер // Quartus II Verilog Template // Single port RAM with single read/write address module single_port_ram #(parameter DATA_WIDTH=8, parameter ADDR_WIDTH=6) ( input [(DATA_WIDTH-1):0] data, input [(ADDR_WIDTH-1):0] addr, input we, clk, output [(DATA_WIDTH-1):0] q ); // Declare the RAM variable reg [DATA_WIDTH-1:0] ram[2**ADDR_WIDTH-1:0]; // Variable to hold the registered read address reg [ADDR_WIDTH-1:0] addr_reg; always @ (posedge clk) begin // Write if (we) ram[addr] <= data; addr_reg <= addr; end // Continuous assignment implies read returns NEW data. // This is the natural behavior of the TriMatrix memory // blocks in Single Port mode. assign q = ram[addr_reg]; endmodule Планирую, что этот модуль будет использовать выделенные блоки памяти. На этапе Analysis & Synthesis получаю такое предупреждение: Цитата Warning: Assertion warning: Current device family (FLEX10K) does not support dual-port synchronous RAM -- implementing the synchronous RAM as a DFFE array instead Я знаю, что семейство FLEX10K не поддерживает двухпортовую память. Но я ведь использую однопортовую. На этапе Fitter память размещается уже не в блоках памяти, а используя ресурсы логики. Как используя Verilog-код создать модуль памяти, использующий встроенные блоки памяти? Что не так с этим модулем из шаблонов? Изменено 28 апреля, 2023 пользователем srf55 опечатка Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 28 апреля, 2023 Опубликовано 28 апреля, 2023 · Жалоба Сиё однозначно двухпортовое ОЗУ получается. Смотрите Eleborated RTL - там в картинках нарисовано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
srf55 2 28 апреля, 2023 Опубликовано 28 апреля, 2023 · Жалоба Я видел, что получается двухпортовое ОЗУ(только не понял почему, ведь в коде однопортовое). Вопрос в следующем: как сделать однопортовое ОЗУ для этой ПЛИС на verilog (и чтобы использовались выделенные блоки памяти, а не логика)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 28 апреля, 2023 Опубликовано 28 апреля, 2023 · Жалоба 6 minutes ago, srf55 said: Вопрос в следующем: как сделать однопортовое ОЗУ для этой ПЛИС на verilog (и чтобы использовались выделенные блоки памяти, а не логика)? Адрес чтения-записи должен быть одинаковый. Физически, а не логически) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
srf55 2 28 апреля, 2023 Опубликовано 28 апреля, 2023 · Жалоба des00, адрес на ОЗУ и так один. Думаю, что здесь дело совсем не в адресе. Может атрибуты какие-нибудь есть, чтобы явно указать что память является однопортовой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 28 апреля, 2023 Опубликовано 28 апреля, 2023 · Жалоба 31 minutes ago, srf55 said: des00, адрес на ОЗУ и так один. Думаю, что здесь дело совсем не в адресе. Может атрибуты какие-нибудь есть, чтобы явно указать что память является однопортовой. Quote always @ (posedge clk) begin // Write if (we) ram[addr] <= data; addr_reg <= addr; end assign q = ram[addr_reg]; вроде один код читаем. 3 hours ago, srf55 said: Я знаю, что семейство FLEX10K не поддерживает двухпортовую память. Но я ведь использую однопортовую. более того, она хоть и синхронная по записи, но с асинхронным чтением. нет внутри памяти регистров, только снаружи. поэтому и шаблоны, которые вы применяете, сделанные для ПЛИС с блочной памятью с регистрами не подходят для нее. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 28 апреля, 2023 Опубликовано 28 апреля, 2023 · Жалоба В "один момент времени" адрес для чтения не совпадает с адресом по записи (по значению). Запись по текущему адресу, а чтение по предыдущему. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
srf55 2 28 апреля, 2023 Опубликовано 28 апреля, 2023 · Жалоба Спасибо! Попробовал исправлять адрес на одинаковый. И сделал чтение синхронным. Следующим образом: Цитата // Quartus II Verilog Template // Single port RAM with single read/write address module single_port_ram #(parameter DATA_WIDTH=8, parameter ADDR_WIDTH=6) ( input [(DATA_WIDTH-1):0] data, input [(ADDR_WIDTH-1):0] addr, input we, clk, output reg [(DATA_WIDTH-1):0] q ); // Declare the RAM variable reg [DATA_WIDTH-1:0] ram[2**ADDR_WIDTH-1:0]; always @ (posedge clk) begin // Write if (we) ram[addr] <= data; end always @ (posedge clk) begin // Read q <= ram[addr] ; end endmodule Это предупреждение больше не появляется: Цитата Warning: Assertion warning: Current device family (FLEX10K) does not support dual-port synchronous RAM -- implementing the synchronous RAM as a DFFE array instead Но память все равно собирается, с использованием логики Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 28 апреля, 2023 Опубликовано 28 апреля, 2023 · Жалоба 25 minutes ago, srf55 said: Но память все равно собирается, с использованием логики проект нужен и где то найти древнючий квартус Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 28 апреля, 2023 Опубликовано 28 апреля, 2023 · Жалоба а сколько всего "такой" памяти в проекте ? и фактические параметры одного экземпляра памяти? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
srf55 2 28 апреля, 2023 Опубликовано 28 апреля, 2023 (изменено) · Жалоба Только что, Alex77 сказал: а сколько всего "такой" памяти в проекте ? и фактические параметры одного экземпляра памяти? 2 килобайта ( 2048 x 8 ) Изменено 28 апреля, 2023 пользователем srf55 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 28 апреля, 2023 Опубликовано 28 апреля, 2023 · Жалоба 25 minutes ago, Alex77 said: а сколько всего "такой" памяти в проекте ? и фактические параметры одного экземпляра памяти? ну это флекс 10к, 50ка, ЕМНП у него 10 блочков памяти, варианты включения 2048x1, 1024x2, 512x4, 256x8. странно, где он в последнем описании находит двухпортовку. Если только по формальным признакам: два процесса и надо в один запихать) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 28 апреля, 2023 Опубликовано 28 апреля, 2023 · Жалоба 19 minutes ago, srf55 said: 2 килобайта ( 2048 x 8 ) а Wizard/Core Generator нету? сгенерировали б и проблем нет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
srf55 2 28 апреля, 2023 Опубликовано 28 апреля, 2023 · Жалоба Запихивание в один процесс тоже результата не дает) Есть атрибут ramstyle, но его использование тоже не помогает) Квартус упорно собирает блок памяти, используя логику. Можно конечно использовать мегафункцию, с ней все прекрасно собирается на блочной памяти. Но хотелось бы разобраться с verilog-кодом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 28 апреля, 2023 Опубликовано 28 апреля, 2023 · Жалоба 9 minutes ago, srf55 said: Запихивание в один процесс тоже результата не дает) Есть атрибут ramstyle, но его использование тоже не помогает) Квартус упорно собирает блок памяти, используя логику. Можно конечно использовать мегафункцию, с ней все прекрасно собирается на блочной памяти. Но хотелось бы разобраться с verilog-кодом. поробуйте так http://www2.mbari.org/~coletti/dropbox/Altera Quartus II Version 9.0/quartusii_handbook_9.0.pdf стр 273 module clear_ram ( input clock, input reset, input we, input [7:0] data_in, input [4:0] address, output reg [7:0] data_out ); reg [7:0] mem [0:31]; integer i; always @ (posedge clock or posedge reset) begin if (reset == 1'b1) mem[address] <= 0; else if (we == 1'b1) mem[address] <= data_in; data_out <= mem[address]; end endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться