| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 | //// Conditionally register a data word; useful for parameterizing modules.//module condreg  #(parameter bits,    parameter register)   (    input	      clk,    input [bits-1:0]  d,    output [bits-1:0] q    );   reg [bits-1:0]  qr;   wire		   clock = register ? clk : 1'b0;   assign          q = register ? qr : d;   always @(posedge clock)     qr <= d;endmodule // condreg//// To transpose the dimensions of a packed array containing// two-dimentional data, optionally reversing the word/bits order.// The terms "words" and "bits" are as defined to the input data// stream; i.e. the with words = 3, bits = 2 and the d[] array// containing b2 b1 b0 a2 a1 a0, the q[] array will contain:// b2 a2 b1 a1 b0 a0 with no reversal,// a2 b2 a1 b1 a0 b0 with word reversal,// b0 a0 b1 a1 b2 a2 with bit reversal, and// a0 b0 a1 b1 a2 b2 with word and bit reversals.//// If the parameter "transpose" is 0, then no actual transpose is done;// this may be useful to parameterize other modules.//module transpose  #(parameter words,    parameter bits,    parameter reverse_w = 0,    parameter reverse_b = 0,    parameter reg_d     = 0,    parameter reg_q     = 0,    parameter transpose = 1)   (    input		    clk,    input [words*bits-1:0]  d,    output [words*bits-1:0] q   );   wire [words*bits-1:0]    in;   reg [words*bits-1:0]     out;   condreg #(.bits(words*bits), .register(reg_d))   dreg (.clk (clk), .d (d), .q(in));   condreg #(.bits(words*bits), .register(reg_q))   qreg (.clk (clk), .d (out), .q(q));   always @(*)     begin	integer w, b;	for (w = 0; w < words; w = w + 1)	  for (b = 0; b < bits; b = b + 1)	    begin	       integer ww, bb, ii, oo;	       ww = reverse_w ? words-w-1 : w;	       bb = reverse_b ? bits -b-1 : b;	       ii = ww*bits+bb;	       oo = transpose ? b*words+w  : w*bits+b;	       out[oo] = in[ii];	    end     end // always @ (*)endmodule // parameter//// Bit-reverse a packed array//// If the parameter "reverse" is 0, then just pass through// the input; this may be useful to parameterize other modules.//module reverse  #(parameter bits,    parameter reg_d   = 0,    parameter reg_q   = 0,    parameter reverse = 1)   (    input	      clk,    input [bits-1:0]  d,    output [bits-1:0] q    );   wire [bits-1:0]   in;   reg [bits-1:0]    out;   condreg #(.bits(bits), .register(reg_d))   dreg (.clk (clk), .d (d), .q(in));   condreg #(.bits(bits), .register(reg_q))   qreg (.clk (clk), .d (out), .q(q));   always @(*)     begin	integer i;	for (i = 0; i < bits; i = i + 1)	  begin	     integer ii;	     ii = reverse ? bits-i-1 : i;	     out[i] = in[ii];	  end     endendmodule // parameter
 |