blob: 8834d32653a3a8a02a77663f226e59012f3f2e2d [file] [log] [blame]
//See README and tcl for more info
`default_nettype none
`include "defines.v"
module roi(input wire clk,
input wire [DIN_N-1:0] din, output wire [DOUT_N-1:0] dout);
parameter DIN_N = `DIN_N;
parameter DOUT_N = `DOUT_N;
wire [DIN_N-1:0] din_lut;
wire [DOUT_N-1:0] dout_lut;
genvar i;
generate
//CLK
(* KEEP, DONT_TOUCH *)
reg clk_reg;
always @(posedge clk) begin
clk_reg <= clk_reg;
end
//DIN
for (i = 0; i < DIN_N; i = i+1) begin:ins
(* KEEP, DONT_TOUCH *)
LUT6 #(
.INIT(64'b01)
) lut (
.I0(din[i]),
.I1(1'b0),
.I2(1'b0),
.I3(1'b0),
.I4(1'b0),
.I5(1'b0),
.O(din_lut[i]));
end
//DOUT
for (i = 0; i < DOUT_N; i = i+1) begin:outs
(* KEEP, DONT_TOUCH *)
LUT6 #(
.INIT(64'b01)
) lut (
.I0(dout_lut[i]),
.I1(1'b0),
.I2(1'b0),
.I3(1'b0),
.I4(1'b0),
.I5(1'b0),
.O(dout[i]));
end
endgenerate
demoscene demoscene(.clk(clk), .din(din_lut), .dout(dout_lut));
endmodule
module demoscene(input wire clk,
input wire [DIN_N-1:0] din, output wire [DOUT_N-1:0] dout);
parameter DIN_N = `DIN_N;
parameter DOUT_N = `DOUT_N;
//assign dout = 8'b10101010;
demoscene_scroll dut(.clk(clk), .din(din), .dout(dout));
endmodule
/*
Leftmost LED counts at one second
*/
module demoscene_counter(input wire clk,
input wire [DIN_N-1:0] din, output wire [DOUT_N-1:0] dout);
parameter DIN_N = `DIN_N;
parameter DOUT_N = `DOUT_N;
/*
100 MHz clock
Lets get MSB to 1 second
Need 27 bits
In [3]: math.log(100e6, 2)
Out[3]: 26.5754247590989
*/
reg [26:0] div;
always @(posedge clk) begin
div <= div + 1'b1;
end
assign dout = div[26:19];
endmodule
//Loosely based on http://www.asic-world.com/code/hdl_models/lfsr.v
module lfsr(input wire clk, output wire dout);
reg [7:0] out = 8'hAA;
wire feedback = !(out[7] ^ out[3]);
always @(posedge clk) begin
out <= {out[6],out[5],
out[4],out[3],
out[2],out[1],
out[0], feedback};
end
assign dout = out[0];
endmodule
// http://www.fpga4fun.com/Counters3.html
module lfsr2(input wire clk, output wire dout);
reg [7:0] LFSR = 255;
wire feedback = LFSR[7];
assign dout = LFSR[0];
always @(posedge clk) begin
LFSR[0] <= feedback;
LFSR[1] <= LFSR[0];
LFSR[2] <= LFSR[1] ^ feedback;
LFSR[3] <= LFSR[2] ^ feedback;
LFSR[4] <= LFSR[3] ^ feedback;
LFSR[5] <= LFSR[4];
LFSR[6] <= LFSR[5];
LFSR[7] <= LFSR[6];
end
endmodule
/*
Scrolls an LSFR across
*/
module demoscene_scroll(input wire clk,
input wire [DIN_N-1:0] din, output wire [DOUT_N-1:0] dout);
parameter DIN_N = `DIN_N;
parameter DOUT_N = `DOUT_N;
reg [26:0] div;
always @(posedge clk) begin
div <= div + 1'b1;
end
wire randbit;
lfsr2 lfsr(.clk(clk), .dout(randbit));
reg [7:0] leds = 8'hCC;
reg last;
reg tick;
always @(posedge clk) begin
last <= div[23];
tick <= div[23] ^ last;
if (tick) begin
leds = {leds, randbit};
end
end
assign dout = leds;
endmodule