题解 | #信号发生器#
信号发生器
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 ); reg [4:0] square_cnt; always @(posedge clk or negedge rst_n) begin if (~rst_n) begin square_cnt <= 0; end else begin if (wave_choise == 2'd0) begin if (square_cnt == 19) begin square_cnt <= 0; end else begin square_cnt <= square_cnt + 1; end end end end reg triangle_flag; always @(posedge clk or negedge rst_n) begin if (~rst_n) begin wave <= 0; triangle_flag <= 0; end else begin case (wave_choise) 2'b00: begin if (square_cnt == 9) begin wave <= 20; end else if (square_cnt == 19) begin wave <= 0; end else begin wave <= wave; end end 2'b01: begin if (wave == 20) begin wave <= 0; end else begin wave <= wave + 1; end end 2'b10: begin if (triangle_flag == 0) begin if (wave == 0) begin triangle_flag <= 1; wave <= wave + 1; end else begin wave <= wave - 1; end end else begin if (wave == 20) begin triangle_flag <= 0; wave <= wave - 1; end else begin wave <= wave + 1; end end end default: begin wave <= wave; end endcase end end endmodule
按题目所给的时序图,wave的值要保持连续,这会导致波形切换时相位也会发生变化。故要将三种不同的波形生成语句写入同一块中控制wave的连续变化,而不能写成三个独立的波形生成块再按输入进行选取。