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
- end
- endmodule // parameter
|