[an error occurred while processing this directive]
Вот конкретный пример (+)
(«Телесистемы»: Конференция 'Программируемые логические схемы и их применение')

миниатюрный аудио-видеорекордер mAVR

Отправлено SM 20 августа 2004 г. 11:11
В ответ на: Что непонятно-то ? (+) отправлено SM 20 августа 2004 г. 10:52

Тут 8 штук 40-битных регистров, и 8 портов (два 40 битных на чтение, один 40-битный на запись, два 16-битных в адрес-генераторы на чтение и двы 16-битных от адрес-генераторов на запись. Плис еще "недопорт" на чтение кода сдвига на 6 бит)

Это заняло в циклоне 1140 LE. И это вполне нормально (сама память заняла 320 бит 320 триггеров, остальное мультиплексоры и логика разрешения записи).

P.S. модуль не отлажен еще, так что возможно что цифра эта далеко не окончательная, и не факт вообще что все это работает полностью.



module regfile (
adr_da, adr_db, data_da, data_in_dw, data_out_db, wen_dw, adr_dw,
adr_aa, adr_ab, data_in_aa, data_in_ab, data_out_ab, data_out_aa, wen_aa, wen_ab,
shiftcode, shiftcode_out, clk
);

input [2:0] adr_da, adr_db, adr_aa, adr_ab, adr_dw;
input [39:0] data_in_dw;
output [39:0] data_da, data_out_db;
input [15:0] data_in_aa, data_in_ab;
output [15:0] data_out_ab, data_out_aa;
input [6:0] shiftcode;
output [5:0] shiftcode_out;
input clk;
input wen_aa, wen_ab, wen_dw;

reg [39:0] ramblock[0:7];


wire we_aa, we_ab;
assign we_aa = wen_aa && ((adr_aa != adr_dw) || !wen_dw);
assign we_ab = wen_ab && ((adr_ab != adr_dw) || !wen_dw) &&
((adr_ab != adr_aa) || !wen_ab);

always @(posedge clk)
begin
if (wen_dw)
ramblock[adr_dw][39:0] <= data_in_dw;
if (we_aa)
ramblock[adr_aa][15:0] <= data_in_aa;
if (we_ab)
ramblock[adr_ab][15:0] <= data_in_ab;
end

assign data_da = ((adr_da==adr_dw) && wen_dw) ? data_in_dw:ramblock[adr_da][39:0];
assign data_out_db = ((adr_db==adr_dw) && wen_dw) ? data_in_dw:ramblock[adr_db][39:0];
assign data_out_ab = ((adr_ab==adr_dw) && wen_dw) ? data_in_dw[15:0]:ramblock[adr_ab][15:0];
assign data_out_aa = ((adr_aa==adr_dw) && wen_dw) ? data_in_dw[15:0]:ramblock[adr_aa][15:0];

wire signed [5:0] shc;
assign shc = ((shiftcode[2:0]==adr_dw) && wen_dw) ? data_in_dw[5:0]:ramblock[shiftcode[2:0]][5:0];

wire signed [5:0] sum_shc;
assign sum_shc = (shiftcode[3]?-shc:shc) + $signed({shiftcode[5], shiftcode[5],
shiftcode[5], shiftcode[5],
shiftcode[5:4]});

assign shiftcode_out = (shiftcode[6]?shiftcode[5:0]:sum_shc);

endmodule



Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru