| //Need at least one LUT per frame base address we want |
| `ifndef N_LUT |
| `define N_LUT 100 |
| `endif |
| |
| `ifndef N_BRAM |
| `define N_BRAM 8 |
| `endif |
| |
| `ifndef N_DI |
| `define N_DI 1 |
| `endif |
| |
| module top(input clk, stb, [DIN_N-1:0] di, output do); |
| parameter integer DIN_N = `N_DI; |
| parameter integer DOUT_N = `N_LUT + `N_BRAM; |
| |
| wire [DIN_N-1:0] di_buf; |
| genvar i; |
| generate |
| for (i = 0; i < `N_DI; i = i+1) begin:di_bufs |
| IBUF ibuf(.I(di[i]), .O(di_buf[i])); |
| end |
| endgenerate |
| |
| reg [DIN_N-1:0] din; |
| wire [DOUT_N-1:0] dout; |
| |
| reg [DIN_N-1:0] din_shr; |
| reg [DOUT_N-1:0] dout_shr; |
| |
| always @(posedge clk) begin |
| din_shr <= {din_shr, di_buf}; |
| dout_shr <= {dout_shr, din_shr[DIN_N-1]}; |
| if (stb) begin |
| din <= din_shr; |
| dout_shr <= dout; |
| end |
| end |
| |
| assign do = dout_shr[DOUT_N-1]; |
| |
| roi roi ( |
| .clk(clk), |
| .din(din[7:0]), |
| .dout(dout) |
| ); |
| endmodule |
| |
| module roi(input clk, input [7:0] din, output [`N_LUT + `N_BRAM-1:0] dout); |
| genvar i; |
| generate |
| for (i = 0; i < `N_LUT; i = i+1) begin:luts |
| LUT6 #( |
| .INIT(64'h8000_0000_0000_0001 + (i << 16)) |
| ) lut ( |
| .I0(din[0]), |
| .I1(din[1]), |
| .I2(din[2]), |
| .I3(din[3]), |
| .I4(din[4]), |
| .I5(din[5]), |
| .O(dout[i]) |
| ); |
| end |
| endgenerate |
| |
| genvar j; |
| generate |
| for (j = 0; j < `N_BRAM; j = j+1) begin:brams |
| (* KEEP, DONT_TOUCH *) |
| RAMB36E1 #( |
| .INIT_00(256'h8000000000000000000000000000000000000000000000000000000000000000 + (j << 16)) |
| ) bram ( |
| .CLKARDCLK(din[0]), |
| .CLKBWRCLK(din[1]), |
| .ENARDEN(din[2]), |
| .ENBWREN(din[3]), |
| .REGCEAREGCE(din[4]), |
| .REGCEB(din[5]), |
| .RSTRAMARSTRAM(din[6]), |
| .RSTRAMB(din[7]), |
| .RSTREGARSTREG(din[0]), |
| .RSTREGB(din[1]), |
| .ADDRARDADDR(din[2]), |
| .ADDRBWRADDR(din[3]), |
| .DIADI(din[4]), |
| .DIBDI(din[5]), |
| .DIPADIP(din[6]), |
| .DIPBDIP(din[7]), |
| .WEA(din[0]), |
| .WEBWE(din[1]), |
| .DOADO(dout[j + `N_LUT]), |
| .DOBDO(), |
| .DOPADOP(), |
| .DOPBDOP()); |
| end |
| endgenerate |
| endmodule |