题解 | #信号发生器#
信号发生器
http://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 [4:0] CLK_NUM = 5'd19; //-------------wire define------------// //-------------reg define-------------// reg [4:0] clk_cnt; reg triangle_flag; // reg mode_shift; //************************************// // Main code //************************************// //clk counter always @ (posedge clk,negedge rst_n) begin if(!rst_n) clk_cnt <= 5'b0; else if(clk_cnt == CLK_NUM) clk_cnt <= 5'b0; else clk_cnt <= clk_cnt + 1'b1; end // // 0 --> 1模式切换标志 // always @ (posedge clk,negedge rst_n) // begin // if(!rst_n) // mode_shift <= 1'b0; // else if(wave_choise == 2'b01) // mode_shift <= 1'b1; // else // mode_shift <= 1'b0; // end // //output always @ (posedge clk,negedge rst_n) begin if(!rst_n) begin wave <= 5'b0; triangle_flag <= 1'b0; end else case(wave_choise) 2'b00:begin if(clk_cnt == 5'd9) wave <= 5'd20; else if(clk_cnt == CLK_NUM) wave <= 5'd0; else wave <= wave; end 2'b01:begin wave <= wave==5'd20 ? 5'd0 : wave + 1'b1; end 2'b10:begin if(triangle_flag) begin wave <= wave + 1'b1; triangle_flag <= wave==5'd19 ? ~triangle_flag : triangle_flag; end else begin wave <= wave - 1'b1; triangle_flag <= wave==5'd1 ? ~triangle_flag : triangle_flag; end end default:wave <= 5'b0; endcase end endmodule