module dsp_array
(
input clk,
input ce_a,
input ce_b,
input ce_m,
input ce_p,
input ce_mode,
input [9 -1:0] mode_z,
input [5*18-1:0] a,
input [1*17-1:0] b,
output [9*47-1:0] p
);
`include "../modexpng_parameters_x8.vh"
wire [17:0] casc_a[0:3];
wire [16:0] casc_b[0:3];
wire ce_a0 = ce_a;
reg ce_a1 = 1'b0;
reg ce_a2 = 1'b0;
wire ce_b0 = ce_b;
reg ce_b1 = 1'b0;
always @(posedge clk) begin
ce_a1 <= ce_a0;
ce_a2 <= ce_a1;
ce_b1 <= ce_b0;
end
genvar z;
generate for (z=0; z<(NUM_MULTS/2); z=z+1)
//
begin : gen_DSP48E1
//
dsp_slice #
(
.AB_INPUT("DIRECT"),
.B_REG(2)
)
dsp_direct
(
.clk (clk),
.ce_a1 (ce_a0),
.ce_b1 (ce_b0),
.ce_a2 (ce_a1),
.ce_b2 (ce_b1),
.ce_m (ce_m),
.ce_p (ce_p),
.ce_mode (ce_mode),
.a (a[z*18+:18]),
.b (b),
.p (p[47*2*z+:47]),
.inmode (5'b00000),
.opmode ({1'b0, mode_z[2*z], 1'b0, 2'b01, 2'b01}),
.alumode (4'b0000),
.casc_a_in ({18{1'b0}}),
.casc_b_in ({17{1'b0}}),
.casc_a_out (casc_a[z]),
.casc_b_out (casc_b[z])
);
//
dsp_slice #
(
.AB_INPUT("CASCADE"),
.B_REG(1)
)
dsp_cascade
(
.clk (clk),
.ce_a1 (ce_a1),
.ce_b1 (1'b0),
.ce_a2 (ce_a2),
.ce_b2 (ce_b1),
.ce_m (ce_m),
.ce_p (ce_p),
.ce_mode (ce_mode),
.a (a[z*18+:18]),
.b (b),
.p (p[47*(2*z+1)+:47]),
.inmode (5'b00000),
.opmode ({1'b0, mode_z[2*z+1], 1'b0, 2'b01, 2'b01}),
.alumode (4'b0000),
.casc_a_in (casc_a[z]),
.casc_b_in (casc_b[z]),
.casc_a_out (),
.casc_b_out ()
);
//
end
//
endgenerate
dsp_slice #
(
.AB_INPUT("DIRECT"),
.B_REG(2)
)
dsp_aux
(
.clk (clk),
.ce_a1 (ce_a0),
.ce_b1 (ce_b0),
.ce_a2 (ce_a1),
.ce_b2 (ce_b1),
.ce_m (ce_m),
.ce_p (ce_p),
.ce_mode (ce_mode),
.a (a[4*18+:18]),
.b (b),
.p (p[47*2*4+:47]),
.inmode (5'b00000),
.opmode ({1'b0, mode_z[2*4], 1'b0, 2'b01, 2'b01}),
.alumode (4'b0000),
.casc_a_in ({18{1'b0}}),
.casc_b_in ({17{1'b0}}),
.casc_a_out (),
.casc_b_out ()
);
endmodule