// --------------------------------------------------------------------
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// --------------------------------------------------------------------
// Module: Pulse_gen
//
// Author: Step
//
// Description: Pulse generate module
//
// Web: www.ecbcamp.com
//
// --------------------------------------------------------------------
// Code Revision History :
// --------------------------------------------------------------------
// Version: |Mod. Date: |Changes Made:
// V1.0 |2015/11/11 |Initial ver
// --------------------------------------------------------------------
module Pulse_gen
(
input clk_in,
input rst_n_in,
input key_menu,
input key_up,
input key_down,
output menu_state,
output reg pulse_out
);
//Debounce for key
wire [2:0] key_state,key_pulse;
Debounce1 Debounce_uut
(
.clk(clk_in),
.rst_n(rst_n_in),
.key_n({key_menu,key_up,key_down}),
.key_state(key_state),
.key_pulse(key_pulse)
);
wire menu_state = key_state[0];
wire up_pulse = key_pulse[1];
wire down_pulse = key_pulse[2];
reg [3:0] cycle;
reg [3:0] duty;
//Control cycle and duty cycle
always @(posedge clk_in or negedge rst_n_in) begin
if(!rst_n_in) begin
cycle<=4'd8;
duty<=4'd4;
end else begin
if(menu_state) begin
if(up_pulse && (cycle<4'd15)) cycle <= cycle + 4'd1;
else if(down_pulse && (cycle>(duty+4'd1))) cycle <= cycle - 4'd1;
else cycle <= cycle;
end else begin
if(up_pulse && (cycle>(duty+4'd1))) duty <= duty + 4'd1;
else if(down_pulse && (duty>4'd0)) duty <= duty - 4'd1;
else duty <= duty;
end
end
end
reg [3:0] cnt;
//counter for cycle
always @(posedge clk_in or negedge rst_n_in) begin
if(!rst_n_in) begin
cnt<=4'd0;
end else begin
if(cnt>=cycle) cnt<=4'd0;
else cnt <= cnt + 4'd1;
end
end
//pulse generate with duty
always @(posedge clk_in or negedge rst_n_in) begin
if(!rst_n_in) begin
pulse_out<=1'b1;
end else begin
if(cnt<=duty) pulse_out<=1'b1;
else pulse_out<=1'b0;
end
end
endmodule