Инициализация RAM в FPGA Altera

Эмм, читал сейчас Recommended HDL coding styles в книжке по Квартусу и вот что не совсем понятно:

1) в секции про RAM в примерах они используют инициализацию ячеек памяти при включении питания. Используется конструкция с блоком initial и еще директива $readmemh(b) с загрузкой содержимого из файла. Причем вроде как говорится, что эти конструкции подходят не только для симуляции, но и для синтеза. Для меня это пока странно, т.к. во многих учебниках по Verilog указано, что initial — это чисто симуляционная директива, типо тестбенчи писать. НО если уж все реально синтезится, то интересно еще и понимать как это реализовано физически. Что, создается таблица ROM и из нее уже данные читаются?

2) снова инициализация, но уже триггеров.
такой код тоже немножко удивил, ведь не привык, что он используется для синтеза. Типо reg myreg = 1'b1. И утверждается, что его значение при инициализации будет 1, а не 0, как по умолчанию на Альтеровских девайсах. Недопонял вот что — единицей будет инициализироваться всегда — и при power-on, и при синхронном или асинхронном сбросе. Все верно?
  • 0
  • 20 ноября 2011, 12:00
  • tda2030

Комментарии (5)

RSS свернуть / развернуть
Про «Initial только для синтеза» — брешуть, неоднократно убеждался.
А инициализация памяти происходит при загрузке конфигурации.
При включение плисина чистая. Она либо по ActiveSerial тянет из EPCS прошивку, либо через бластер с компа.
В этой-то прошивке, видимо, помимо всяких там соединений (грубо говоря, у каждого ключа в плисине, соединяющего LE, имеется ячейка памяти. Вот запись в эти ячейки и есть конфигурация ПЛИС — что куда подключено), есть возможность записать в конкретные адреса нужные значения.
0
не-не-не, имелась ввиду там RAM, что используется самим проектом.
типо

module myram (clock, data, addr,...)
input clock;
...

reg [7:0] mymem [memdepth:0]; //memdepth = 2^addr
...

initial begin
$readmemb("raminit.txt", mymem);
end
...

endmodule
0
при сбросе, синхронном или асинхронном вы сами задаете начальные значения нужных регистром.
always @(posedge clk or posedge reset)
if (reset)
   begin
     flop1 <= 0;
     flop2 <= 1;
   end

инициализация регистров выглядит аналогична с языками высокого уровня:
reg [7:0] flop = 1; 
always @(posedge clk)
   flop <= flop + 1;

после прихода положительное фронта clk, во flop будет записано 2.

насчет памяти точно не скажу, но факт что ее инициализировать можно из файла.
в схематике мегафункция памяти позволяет выбрать файл каким инициализировать.
на verilog видимо через initial
0
да, про ресет флип-флопа чет я подзатупил, а вопрос с инициализацией памяти остается открытым. Хотелось бы подробнее узнать как там все происходит на физическом уровне. Интересно жеж :)
0
память ROM и RAM на ПЛИСе реализуется одними и теми же элементами. Просто ROM не доступна для записи, ебстесственно. Но она прекрасно «прошивается» при конфигурировании из конфПЗУ. А чем RAM хуже? точно также «заливается» содержимое и открывается доступ к перезаписи. Сам файл «прошивки» хранится так же в конфПЗУ.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.