Untitled
unknown
verilog
2 years ago
1.6 kB
6
Indexable
`timescale 1ps/1ps module clock_divider #(parameter n = 25)( input clk, output clk_div ); reg[n-1:0]num; wire[n-1:0]next_num; always@(posedge clk)begin num <= next_num; end assign next_num = num + 1; assign clk_div = num[n-1]; endmodule module lab3_1 ( input clk, input rst, input en, input speed, output reg [15:0] led ); wire clk_div_25, clk_div_27; clock_divider #(25) div1(.clk(clk), .clk_div(clk_div_25)); clock_divider #(27) div2(.clk(clk), .clk_div(clk_div_27)); assign clk_used = (speed) ? clk_div_25 : clk_div_27; // Use a counter to deal with the light; reg [2:0] cnt, nxt_cnt; always @(posedge clk_used) begin cnt <= nxt_cnt; end always @(*) begin if(cnt == 3'b100) nxt_cnt = 0; else nxt_cnt = cnt + 1; end // For output reg [15:0] nxt_led; always @(posedge clk_used, posedge rst) begin if(rst) begin led <= 16'b0000000000000000; end else begin if(en) begin // Ctrl the led case(cnt) 3'b000: led <= 16'b0000000000000000; 3'b001: led <= 16'b1000100010001000; 3'b010: led <= 16'b1100110011001100; 3'b011: led <= 16'b1110111011101110; 3'b100: led <= 16'b1111111111111111; default: led <= led; endcase end else led <= led; end end endmodule
Editor is loading...