Jump to content

    
andrei-sedov

Actel pеализация встроенной ROM-памяти

Recommended Posts

Здравствуйте.
С недавнего времени осваиваю разработку проектов под ПЛИС для семейства ProASIC3E (ранее имел дело только с Altera и Xilinx) и столкнулся с проблемой нехватки информации и технической поддержке. В моем проекте имеется два процессорных ядра каждое из которых имеет память ROM 4096x32 инструкций. В результате разводки выдается ошибка:
 
Error: [fail_to_route]:
    Router fails. Shorts = 6407. Open nets = 0.

 
Я подозреваю, что не хватает каких то ресурсов. Где посмотреть что это значит? Синтез проекта проходит нормально:

Core Cells         : 46826 of 75264 (62%)
IO Cells           : 46
  RAM/ROM Usage Summary
Block Rams : 79 of 112 (70%)
 
Скажите пожалуйста можно ли в семействе ProASIC3E реализовать память типа ROM на встроенный блоках памяти (RAM) по аналогии как в ПЛИС Altera?
 
Директива синтезатора Synplify Pro: synthesis syn_romstyle = "lsram"  — не дает результата (память реализуется на логический элементах). Пример:
 
module rom1(clk, addr, q)/* synthesis syn_romstyle = "lsram" */;
input    clk;
input    [11:0] addr;
output [31:0] q;
reg [31:0] m;
reg [31:0] q;
always @(posedge clk)
begin
 q[31:0] <= m[31:0];
end
always @(*)
begin
 case (addr[11:0])
  12'h000 : m[31:0] = 32'hA0FC0000;
  12'h001 : m[31:0] = 32'hA0FE0000;
  12'h002 : m[31:0] = 32'hA0FD0000;
  12'h003 : m[31:0] = 32'h04FF0000;
  12'h004 : m[31:0] = 32'h00000100;
  12'h005 : m[31:0] = 32'h6BFCFCFC;
...
 
Синтезатор понимает, что это ROM:

@N: MO106 :"f:\project\microsemi\core\hdl\rom1.v":19:1:19:4|Found ROM .delname. (in view: work.rom1(verilog)) with 4096 words by 32 bits.

 
Заранее благодарен за любую оказанную помощь в моей проблеме.

Share this post


Link to post
Share on other sites
17 minutes ago, andrei-sedov said:

always @(posedge clk)
begin
 q[31:0] <= m[31:0];
end

Уверены, что это физически можно реализовать с той встроенной памятью, которая есть в этих чипах?  - т.е. что при подаче адреса за один  такт получится прочитать содержимое данной ячейки памяти.

Share this post


Link to post
Share on other sites
3 минуты назад, Yuri124 сказал:

Уверены, что это физически можно реализовать с той встроенной памятью, которая есть в этих чипах?  - т.е. что при подаче адреса за один  такт получится прочитать содержимое данной ячейки памяти.

Не уверен, но это стандартное описание ROM-памяти, можно сделать регистровый выход или выход. Вопрос в том можно ли вообще реализовать память типа ROM на встроенных блоках памяти?

Share this post


Link to post
Share on other sites
15 minutes ago, andrei-sedov said:

можно ли вообще реализовать память типа ROM на встроенных блоках памяти?

Это не поможет ответить на Ваш вопрос?

 

В том документе есть такая фраза:

Quote

 If  the users main design  only has access to the read  ports of  the RAM block (RADDR, RD, RCLK, and  REN)

и я предполагаю, что попытка чтения их этой памяти через такой простой блок, как 

Quote

always @(posedge clk)
begin
 q[31:0] <= m[31:0];
end

не прокатит.

Share this post


Link to post
Share on other sites
Цитата

Скажите пожалуйста можно ли в семействе ProASIC3E реализовать память типа ROM на встроенный блоках памяти (RAM) по аналогии как в ПЛИС Altera?

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

Цитата

Error: [fail_to_route]:
    Router fails. Shorts = 6407. Open nets = 0.
 
Я подозреваю, что не хватает каких то ресурсов. Где посмотреть что это значит? Синтез проекта проходит нормально:

Я думаю дизайнер пытается вытянуть временные ограничения и размещает все это так, что потом не может развести.

Я бы попробовал разбить ваши таблицы на 4 или 8 поменьше размером, с защелками на выходах, с последующим объединением.

Share this post


Link to post
Share on other sites
3 часа назад, Shamil сказал:

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

Это понятно, что ОЗУ теряет свое содержимое после выключения питания, но например ПЛИС Altera позволяет строить из своих блоков RAM память типа ROM. В этом случае блоки RAM инициализируются на этапе конфигурации ПЛИС и в дальнейшем данные неизменно хранятся и доступны для чтения. Синтезатор распознает приведенное выше описание модуля констант как память типа ROM и размещает данные в блоках RAM. 

Хотелось бы знать имеется ли подобная технология в ПЛИС семействе ProASIC3E?

P.S. Как я уже писал, в синтезаторе Synplify Pro имеется директива определяющая тип построения памяти: syn_romstyle = "URAM|lsram|..." 

 

Неужели никто не работал с массивами констант, перекодирующими таблицами и т.д.?

Share this post


Link to post
Share on other sites
9 часов назад, andrei-sedov сказал:

Это понятно, что ОЗУ теряет свое содержимое после выключения питания, но например ПЛИС Altera позволяет строить из своих блоков RAM память типа ROM. В этом случае блоки RAM инициализируются на этапе конфигурации ПЛИС и в дальнейшем данные неизменно хранятся и доступны для чтения. Синтезатор распознает приведенное выше описание модуля констант как память типа ROM и размещает данные в блоках RAM. 

Хотелось бы знать имеется ли подобная технология в ПЛИС семействе ProASIC3E?

Нет у Actel такого!
Вам придется самостоятельно заполнять блоки RAM содержимым таблиц при каждом включении питания.

9 часов назад, andrei-sedov сказал:

Неужели никто не работал с массивами констант, перекодирующими таблицами и т.д.?

Да работаем постоянно. С такой проблемой как у Вас не сталкивались, правда и таблиц настолько больших не было.

Самая большая табличка которая была:

	localparam COEF_WIDTH = 12;							// Разрядность коэфициентов фильтра (включая знаковый разряд)
	localparam COEF_QN = 960;							// Кол-во коэфициентов фильтра
	localparam COEF_TABLE_SIZE = COEF_QN / 2 + 1;					// Размер таблицы коэфициентов фильтра

	localparam ACC_WIDTH = 20;							// Разрядность аккумлятора фильтра

	wire [COEF_WIDTH-1:0]CoefTableTx[COEF_TABLE_SIZE-1:0];

	assign CoefTableTx[  0] = 12'h001;
	assign CoefTableTx[  1] = 12'h001;
	assign CoefTableTx[  2] = 12'h002;
	assign CoefTableTx[  3] = 12'h002;
	assign CoefTableTx[  4] = 12'h002;
	assign CoefTableTx[  5] = 12'h002;
	assign CoefTableTx[  6] = 12'h003;
	assign CoefTableTx[  7] = 12'h003;
	assign CoefTableTx[  8] = 12'h003;
	assign CoefTableTx[  9] = 12'h003;
//	.............
	assign CoefTableTx[474] = 12'h7AF;
	assign CoefTableTx[475] = 12'h7B1;
	assign CoefTableTx[476] = 12'h7B3;
	assign CoefTableTx[477] = 12'h7B5;
	assign CoefTableTx[478] = 12'h7B6;
	assign CoefTableTx[479] = 12'h7B6;
	assign CoefTableTx[480] = 12'h000;

 

Share this post


Link to post
Share on other sites

1. А что - такой прием, как инициализация массива, здесь не работает?

2. В качестве синтезатора используется Synplify Pro? Так у него-то с документацией все должно быть в порядке - можно узнать обо всех вариантах работы с ROM и RAM (их там далеко не один только /* synthesis syn_romstyle = "lsram" */).

Share this post


Link to post
Share on other sites

@andrei-sedov

Память ROM на встроенных блоках есть, но объемом только 1 кбит. Cодержимое "прошивается" (перепрошивается) только при помощи программатора. Если актуально, позже напишу как пользоваться

 

FlashROM.png

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.