Verilog仅分配数组元素的一部分

时间:2018-10-09 22:35:24

标签: verilog

我有一个模块,需要很多副本,因此为了简化代码,我使用了索引数组(在很多次之前都已完成此操作)。但是,在这种情况下,连接到我的设备的总线比我的阵列短,因此我必须从阵列元素中读取/写入数据。我还没有找到一种优雅的方式来做到这一点(不要相信下面的代码会起作用)。我可以将数组分成几部分,但是这会使它重新构造为可用变量(往返于模块)很痛苦。关于如何实现此目标有任何想法吗?

谢谢, 戴夫

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

0 个答案:

没有答案