题解 | #信号发生器#
信号发生器
https://www.nowcoder.com/practice/39f6766689cc448e928a0921d1d1f858
`timescale 1ns/1ns module signal_generator( input clk, input rst_n, input [1:0] wave_choise, output reg [4:0]wave ); //方波 parameter max =19, half=9; reg [4:0] sw_cnt; always@(posedge clk or negedge rst_n) begin if(!rst_n) sw_cnt <= 0; else if(wave_choise == 0) begin if(sw_cnt >= max) sw_cnt <= 0; else sw_cnt <= sw_cnt +1; end else sw_cnt <= 0; end //三角波 reg flag;//三角波标志信号 always@(posedge clk or negedge rst_n) begin if(!rst_n) flag <= 1'b1; else if(wave_choise ==2'd2) begin if(wave == 1'b1) //这里从wave =1 -> flag=0 (wave此时减为0) -> wave+1 有两个时钟周期 flag <= 1'b0; else if(wave == max) flag <= 1'b1; else flag <= flag; end else begin if(wave == 0) flag <= 1'b0; else flag <= 1'b1;//进入三角波模式的时候如果wave不是0,先进入递减模式减到0 end end always@(posedge clk or negedge rst_n) begin if(!rst_n) wave <= 5'd0; else begin if(wave_choise ==2'd0) wave <= (sw_cnt < half) ? 5'd0:((sw_cnt >= max)?5'd0:max+1) ;//方波 else if(wave_choise ==2'd1) wave <= (wave >= max+1) ? 5'd0 : (wave +1'b1); //锯齿波 else if(wave_choise ==2'd2) wave <= (flag == 1) ? (wave-1'b1) : (wave+1'b1); //三角波 else wave <= 5'd0; end end endmodule