`timescale 1ns/1ns
module signal_generator(
input clk,
input rst_n,
input [1:0] wave_choise,
output reg [4:0]wave
);
//方波信号: wave_choice=0时: 周期:20个时钟周期 0-9 置位:0 10 -19 置位:20 波形幅值 20
//锯齿波信号:wave_choice=1时: 周期:21个时钟周期 0-20 递增 步长为1
//三角波信号:wave_choice=2时: 周期:40个时钟周期 设置1个上升和下降的标志信号 flag=0 下降 flag=1 上升 波形幅值 20
// wave == 0 时 flag 翻转 开始上升 wave == 19时 flag 翻转 开始下降 其他时候 flag不变 波形幅值 20
reg flag ;
reg [4:0] cnt ;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
wave <= 'd0 ;
flag <= 1'b0;
cnt <= 'd0 ;
end
else begin
case(wave_choise)
2'b00:begin
if(cnt >= 'd0 & cnt < 'd9)begin
wave <= 5'd0 ;
cnt <= cnt + 1'b1 ;
end
else if( cnt == 'd9)begin
wave <= 5'd20 ;
cnt <= cnt + 1'b1 ;
end
else if(cnt >= 'd10 & cnt < 'd19)begin
wave <= 5'd20 ;
cnt <= cnt + 1'b1 ;
end
else if (cnt == 'd19)begin
wave <= 5'd0 ;
cnt <= 'd0 ;
end
end
2'b01:begin
if(wave == 'd20)
wave <= 5'd0 ;
else
wave <= wave + 1'b1 ;
end
2'b10:begin
if(flag == 1'b0)begin
if(wave == 'd0)begin
flag <= ~flag ;
wave <= wave + 1'b1;
end
else begin
flag <= flag ;
wave <= wave - 1'b1;
end
end
else begin
if(wave == 'd20)begin
flag <= ~flag ;
wave <= wave - 1'b1;
end
else begin
flag <= flag ;
wave <= wave + 1'b1;
end
end
end
default: begin
if(cnt >= 'd0 & cnt == 'd9)begin
wave <= 5'd0 ;
cnt <= cnt + 1'b1 ;
end
else if(cnt >= 'd10 & cnt < 'd19)begin
wave <= 5'd20 ;
cnt <= cnt + 1'b1 ;
end
else if (cnt == 'd19)begin
wave <= 5'd20 ;
cnt <= 'd0 ;
end
end
endcase
end
end
endmodule