[an error occurred while processing this directive]
|
Тут 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;
endassign 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: info@telesys.ru