题解 | #信号发生器#
信号发生器
https://www.nowcoder.com/practice/39f6766689cc448e928a0921d1d1f858
module signal_generator( input clk, input rst_n, input [1:0] wave_choise, output reg [4:0]wave ); parameter max_vavlue = 20, T1 = 20, min_value = 0; reg [4:0] cnt; reg flag; // 仅在方波模式工作的计数器 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin cnt <= 0; end else begin // cnt <= wave_choise != 0 ? 0 : cnt == T1 - 1 ? 0 : cnt + 1; if (wave_choise == 0) cnt <= cnt == T1 - 1 ? 0 : cnt + 1; else cnt <= 0; end end // 仅在三角波模式工作的标志位 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin flag <= 0; end else begin // flag <= wave_choise != 2 ? 0 : wave == min_value + 1 ? 1 : wave == max_vavlue - 1 ? 0 : flag; if (wave_choise == 2) begin if (wave <= min_value + 1) flag <= 1; else if (wave >= max_vavlue - 1) flag <= 0; else flag <= flag; end end end // 波形变化 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin wave <=0; end else begin case(wave_choise) 0: begin // wave <= cnt == T1/2 - 1 ? max_vavlue : cnt == T1 - 1 ? min_value : wave; if (cnt == T1/2 - 1) wave <= max_vavlue; else if (cnt == T1 - 1) wave <= min_value; else wave <= wave; end 1: wave <= wave == max_vavlue ? 0 : wave + 1; 2: wave <= flag == 0 ? wave - 1 : wave + 1; default: wave <= 0; endcase end end endmodule