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

Quartus II. FLEX10K. Single port RAM

Добрый день!

Я пытаюсь собрать тестовый проект в 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-код создать модуль памяти, использующий встроенные блоки памяти? Что не так с этим модулем из шаблонов?


 

Изменено пользователем srf55
опечатка

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


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

Сиё однозначно двухпортовое ОЗУ получается. Смотрите Eleborated RTL - там в картинках нарисовано.

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


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

Я видел, что получается двухпортовое ОЗУ(только не понял почему, ведь в коде однопортовое).

Вопрос в следующем: как сделать однопортовое ОЗУ для этой ПЛИС на verilog (и чтобы использовались выделенные блоки памяти, а не логика)? 

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


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

6 minutes ago, srf55 said:

Вопрос в следующем: как сделать однопортовое ОЗУ для этой ПЛИС на verilog (и чтобы использовались выделенные блоки памяти, а не логика)? 

Адрес чтения-записи должен быть одинаковый. Физически, а не логически) 

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


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

des00, адрес на ОЗУ и так один. Думаю, что здесь дело совсем не в адресе. Может атрибуты какие-нибудь есть, чтобы явно указать что память является однопортовой.

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


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

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 не поддерживает двухпортовую память. Но я ведь использую однопортовую. 

более того, она хоть и синхронная по записи, но с асинхронным чтением. нет внутри памяти регистров, только снаружи. поэтому и шаблоны, которые вы применяете, сделанные для ПЛИС с блочной памятью с регистрами не подходят для нее.

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


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

В "один момент времени" адрес для чтения не совпадает с адресом по записи (по значению). Запись по текущему адресу,   а чтение по предыдущему.

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


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

Спасибо! Попробовал исправлять адрес на одинаковый. И сделал чтение синхронным. Следующим образом:

Цитата

// 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

 

Но память все равно собирается, с использованием логики

 

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


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

25 minutes ago, srf55 said:

Но память все равно собирается, с использованием логики

проект нужен и где то найти древнючий квартус

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


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

а сколько всего "такой" памяти в проекте ? и фактические параметры одного экземпляра памяти?

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


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

Только что, Alex77 сказал:

а сколько всего "такой" памяти в проекте ? и фактические параметры одного экземпляра памяти?

2 килобайта ( 2048 x 8 )

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

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


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

25 minutes ago, Alex77 said:

а сколько всего "такой" памяти в проекте ? и фактические параметры одного экземпляра памяти?

ну это флекс 10к, 50ка, ЕМНП у него 10 блочков памяти, варианты включения 2048x1, 1024x2, 512x4, 256x8. странно, где он в последнем описании находит двухпортовку. Если только по формальным признакам: два процесса и надо в один запихать)

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


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

19 minutes ago, srf55 said:

2 килобайта ( 2048 x 8 )

 

а Wizard/Core Generator нету? 

сгенерировали б и проблем нет

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


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

Запихивание в один процесс тоже результата не дает) Есть атрибут ramstyle, но его использование тоже не помогает) Квартус упорно собирает блок памяти, используя логику.

Можно конечно использовать мегафункцию, с ней все прекрасно собирается на блочной памяти. Но хотелось бы разобраться с verilog-кодом.

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


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

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

image.thumb.png.1a58beff4f6c6ef8ef268c7078b3bb68.png

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

 

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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