Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module top (clk_in, pushbutton, resetbutton, allonbutton, altbutton, kittbutton, leds);
- input wire clk_in;
- input wire pushbutton;
- input wire resetbutton;
- input wire allonbutton;
- input wire altbutton;
- input wire kittbutton;
- output wire[7:0] leds;
- // Input clock 50 mhz (board has an oscillator, not just a crystal)
- wire clk1; // 400 MHz
- wire clk2; // 200 MHz
- wire clkOk;
- // Push the 50 mhz clock into a PLL and have it generate 400 and 25 mhz clocks.
- // You can modify the generated frequencies by clicking on the pll.ipx file in Diamond
- // modifying values in the GUI and regenerating.
- pll pll100 (.CLK(clk_in), .CLKOP(clk1), .CLKOK(clk2), .LOCK(clkOk));
- slow_counter counter(.clock(clk1), .enable(pushbutton), .reset(resetbutton), .all_on(allonbutton), .alt(altbutton), .kitt(kittbutton), .output_byte(leds));
- endmodule
- module slow_counter (clock, enable, reset, all_on, alt, kitt, output_byte);
- input wire clock;
- input wire enable;
- input wire reset;
- input wire all_on;
- input wire alt;
- input wire kitt;
- output reg[7:0] output_byte;
- reg [31:0] counter;
- reg [7:0] kittlight;
- reg [31:0] kittcounter;
- reg [4:0] kittstep;
- reg kittdirection;
- initial
- begin
- output_byte = 8'b11111111;
- kittlight = 8'b00000001;
- kittcounter = 32'b0;
- kittstep = 32'b0;
- kittdirection = 1'b1;
- counter = 32'b0;
- end
- always @(posedge clock)
- begin
- if (reset == 1'b0)
- begin
- counter <= 32'b0;
- output_byte <= ~counter[23:16];
- end
- else if (all_on == 1'b0)
- begin
- counter <= 32'b11111111111111111111111;
- output_byte <= ~counter[23:16];
- end
- else if (kitt == 1'b0)
- begin
- counter <= 32'b10101010101010101010101;
- output_byte <= ~counter[23:16];
- end
- else if (alt == 1'b0)
- begin
- // Increase our counter
- kittcounter <= kittcounter + 1'b1;
- if (kittcounter[16] == 1'b1)
- begin
- // Reset the counter
- kittcounter <= 32'b0;
- // Note: I tried using various syntaxes for a shift and none worked: kittlight[7:0] <= (kittlight[7:0] << 1'b1);
- // Note: I added a double-light for my son to see
- // Are we going left or right?
- if (kittdirection == 1'b1)
- begin
- // Going left
- if (kittstep == 0) begin
- kittlight <= 8'b10000001;
- end
- else if (kittstep == 1) begin
- kittlight <= 8'b01000010;
- end
- else if (kittstep == 2) begin
- kittlight <= 8'b00100100;
- end
- else if (kittstep == 3) begin
- kittlight <= 8'b00011000;
- end
- else if (kittstep == 4) begin
- kittlight <= 8'b00011000;
- end
- else if (kittstep == 5) begin
- kittlight <= 8'b00100100;
- end
- else if (kittstep == 6) begin
- kittlight <= 8'b01000010;
- end
- else if (kittstep == 7) begin
- kittlight <= 8'b10000001;
- end
- end
- else
- begin
- // Going right
- if (kittstep == 0) begin
- kittlight <= 8'b10000001;
- end
- else if (kittstep == 1) begin
- kittlight <= 8'b01000010;
- end
- else if (kittstep == 2) begin
- kittlight <= 8'b00100100;
- end
- else if (kittstep == 3) begin
- kittlight <= 8'b00011000;
- end
- else if (kittstep == 4) begin
- kittlight <= 8'b00011000;
- end
- else if (kittstep == 5) begin
- kittlight <= 8'b00100100;
- end
- else if (kittstep == 6) begin
- kittlight <= 8'b01000010;
- end
- else if (kittstep == 7) begin
- kittlight <= 8'b10000001;
- end
- end
- // If we're reached the last step, change direciton
- kittstep <= kittstep + 1'b1;
- if (kittstep[3] == 1'b1) begin
- kittstep[4:0] <= 4'b0;
- kittdirection <= ~kittdirection;
- end
- end
- // Always update the light
- output_byte <= ~kittlight[7:0];
- end
- else if (enable == 1'b0)
- begin
- counter <= counter + 1'b1;
- output_byte <= ~counter[23:16];
- end
- end
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement