blob: a178c54cb58a187614a8856c4a4ed529d3e193fd [file] [log] [blame] [edit]
module top
(
input wire clk,
input wire rx,
output wire tx,
input wire [15:0] sw,
output wire [15:0] led
);
parameter PRESCALER = 4; //100000;
// UART loopback
assign tx = rx;
// ============================================================================
// Reset
reg [3:0] rst_sr;
wire rst;
initial rst_sr <= 4'hF;
always @(posedge clk)
if (sw[0]) rst_sr <= 4'hF;
else rst_sr <= rst_sr >> 1;
assign rst = rst_sr[0];
// ============================================================================
// Clock prescaler
reg [32:0] ps_cnt = 0;
wire ps_tick = ps_cnt[32];
always @(posedge clk)
if (rst || ps_tick)
ps_cnt <= PRESCALER - 2;
else
ps_cnt <= ps_cnt - 1;
// ============================================================================
// SRL32 testers
wire sim_error = sw[2];
wire [3:0] srl_q;
wire [3:0] error;
genvar i;
generate for(i=0; i<4; i=i+1) begin
wire [6:0] srl_a;
wire srl_d;
wire srl_sh;
localparam SITE = (i==0) ? "SLICE_X2Y100" :
(i==1) ? "SLICE_X2Y101" :
(i==2) ? "SLICE_X2Y102" : "SLICE_X2Y103";
srl_shift_tester #(.FIXED_DELAY(32*(i+1)-1), .SRL_LENGTH(32 * (i+1))) tester
(
.clk (clk),
.rst (rst),
.ce (ps_tick),
.srl_sh (srl_sh),
.srl_d (srl_d),
.srl_q (srl_q[i] ^ sim_error),
.srl_a (srl_a),
.error (error[i])
);
srl32_chain_seg #(.SITE(SITE), .N(i+1)) chain_seg
(
.CLK (clk),
.CE (srl_sh),
.A (srl_a),
.D (srl_d),
.Q (srl_q[i])
);
end endgenerate
// ============================================================================
// Error latch
reg [3:0] error_lat = 0;
always @(posedge clk)
if (rst)
error_lat <= 0;
else
error_lat <= error_lat | error;
// ============================================================================
// Create a non-GND/VCC source for additional LED outputs.
// This is a side affect of the ROI disallowing GND/VCC connections to synth
// IO pads.
wire net_0;
LUT2 #(.INIT(4'hC)) lut_0 (.I0(|sw), .I1(&sw), .O(net_0));
// LEDs
genvar j;
generate for(j=0; j<8; j=j+1) begin
if (j < 4) begin
assign led[j ] = (sw[1]) ? error_lat[j] : error[j];
assign led[j+8] = srl_q[j];
end else begin
assign led[j ] = net_0;
assign led[j+8] = net_0;
end
end endgenerate
endmodule