У меня есть модуль, который мне нужно ОЧЕНЬ много копий, поэтому для упрощения кода я использую индексированный массив (делал это раньше много раз).Но в этом случае шина, которая связана с моим устройством, короче, чем мой массив, поэтому я должен читать / писать из элементов массива по частям.Я не смог найти элегантный способ сделать это (не верю, что приведенный ниже код будет работать).Я могу разбить массивы на куски, но это делает перестройку его в пригодные для использования переменные болезненными (как для модуля, так и для модуля).Есть мысли о том, как мне это сделать?
Спасибо, Дейв.
module xMain(
input wire clk48M, // System clock
inout wire [7:0] ucDb, // Data bus value
input wire ucMsb, // Variable Lsb/Msb
input wire ucAd, // Module address
input wire ucRdb, // Micro read\
input wire ucWrb, // Micro write\
input wire ucCsb // Micro chip select\
);
reg [7:0] UcOut; // Output register
reg [13:0] ModInp [1:0]; // Module input
wire [15:0] ModOut [1:0]; // Module output
assign ucDb = (!ucCsb && !ucRdb && ucWrb) ? UcOut : 8'bz;
xModule U1 ( .modClk(clk48M), .inVal(ModInp[0]), .outVal(ModOut[0]) );
xModule U2 ( .modClk(clk48M), .inVal(ModInp[1]), .outVal(ModOut[2]) );
always @( posedge clk48M )
begin
if ( !UcCsb && UcRdb && !UcWrb ) begin
if ( ucMsb ) begin
ModInp[ucAd][13:8] <= ucDb[5:0];
end
else begin
ModInp[ucAd][7:0] <= ucDb;
end
else if ( !UcCsb && !UcRdb && UcWrb ) begin
if ( ucMsb ) begin
UcOut <= ModOut[ucAd][15:8];
end
else begin
UcOut <= ModOut[ucAd][7:0];
end
end
end
endmodule
// Dummy module shown below
module xModule(
input wire modClk, // Module clock
input wire [13:0] inVal, // Input value
output reg [15:0] outVal // Output value
);
always @( posedge modClk )
begin
outVal[15] <= 0; // do something to the input
outVal[14] <= 0; // to generate an output
outVal[13:0] <= inVal;
end
endmodule