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

ROM Verilog Altera Xilinx

Приветствую!

 

Написал файл ПЗУ. Как сумел.

 

А как сделать чтоб грамотно) и корректно отрабатывалось синтезаторами Altera и Xilinx и задействовало блочную память и там и тут?

rom.v

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


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

Приветствую!

 

Написал файл ПЗУ. Как сумел.

 

А как сделать чтоб грамотно) и корректно отрабатывалось синтезаторами Altera и Xilinx и задействовало блочную память и там и тут?

я беру библиотечный элемент памяти и устанавливаю его.

 

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


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

Приветствую!

 

Написал файл ПЗУ. Как сумел.

 

А как сделать чтоб грамотно) и корректно отрабатывалось синтезаторами Altera и Xilinx и задействовало блочную память и там и тут?

 

у xilinx

 

attribute RAM_STYLE : string;

attribute RAM_STYLE of <entity_name>: entity is "BLOCK";

 

attribute RAM_STYLE : string;

attribute RAM_STYLE of <signal_name>: signal is "BLOCK";

 

вместо "BLOCK" дописывается блочная память для опред кристалла

 

или можно Primitive instantion типа RAMB8BWER_inst : RAMB8BWER

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

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


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

2 Sergei_Ilchenko

 

Если именно атрибуты интересуют:

XILINX

//synthesis attribute ram_style of sv_mem is block

ALTERA

/* synthesis ramstyle = "M9K" */

 

Ну а если по коду: пример кода из Q2 или из ISE, там где ROM, одинаковый. И оба ложат по умолчанию в блоковую.

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


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

Сделал через case. 121790 байт файлик. В квартусе в блочную лег. Супер!

rom.v

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


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

Выдрал из кода кусок с памятью

wire [15:0] adress = sel_sin_cos ? addres_cos : addres_sin; // Формируем адрес
(* rom_style = "block" *) reg [15:0] mem [0:7499]; // Объявляем память + указываем чтобы компилятор использовал блочную память.
initial begin
$readmemh("memory_cos.list", mem); // memory_cos - это файл с содержимым  ROM (кладем этот файл в корень проекта)
end;
assign cos_sin = mem[adress]; // чтение содержимого файла

 

я беру библиотечный элемент памяти и устанавливаю его.

 

Не удобно

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


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

У альтеры есть такая бумажка Recommended HDL Coding Styles.

Если следовать ее рекомендациям, синтезатор автоматом будет использовать нужные мегафункции, ram/rom в том числе.

 

Например, rom

 

module Rom  #(parameter B=28,LM=11)
(
  input wire [LM-1:0] addr1,
  input wire [LM-1:0] addr2,
  input wire rclk,
  output reg signed [B-1:0] bout1,
  output reg signed [B-1:0] bout2
);

   reg [B-1:0] sr [(2**LM)-1:0];
    
   initial begin
    $readmemb("coeff.dat",sr);
   end

  always @(posedge rclk) begin
      bout1<=sr[addr1];
      bout2<=sr[addr2];
  end

endmodule

 

однозначно подменится синтезатором мегафункцией с memory blocks, о чем он радостно сообщит.

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


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

У альтеры есть такая бумажка Recommended HDL Coding Styles.

В приведенном Вами коде, схема отработает за один такт. У блочной памяти есть регистры на входе и на выходе. Какие из них решит использовать Quartus - неизвестно, а иногда это желательно знать.

Еще веселее, если описать память с латентностью 2. Вы ожидаете, что будут задействованы входные и выходные триггеры блочной памяти, а Quartus защелкивает вашу шину адреса в обычных триггерах, затем во входных триггерах блочной памяти и в итоге получается понижение быстродействия схемы и потеря нескольких триггеров.

Так что лично мой выбор - библиотечный элемент памяти.

 

Но ТС хочет чтобы его код понимал и Quartus и ISE, так что этот способ ему не подходит.

Вот если бы в VHDL были директивы ассемблеру, как в С...

 

P.S. Конечно же имел в виду директивы компилятору, а не ассемблеру.

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


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

..У блочной памяти есть регистры на входе и на выходе. Какие из них решит использовать Quartus - неизвестно, а иногда это желательно знать...

Если самому устанавливать набор QSF настроек, использовать Recommended HDL Coding Styles + директивы в коментах (здесь можно и с некоторыми QSF настройками пободаться B) ) - всё будет находиться именно там, где и планировалось. Всё это можно сделать и для хилых. Делали куски переносимого дизайна несколько раз - всё на своих местах и работает в железяках.

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


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

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

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

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

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

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

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

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

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

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