`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