题解 | #信号发生器#
信号发生器
https://www.nowcoder.com/practice/39f6766689cc448e928a0921d1d1f858
module signal_generator( input clk, input rst_n, input [1:0] wave_choise, output reg [4:0] wave ); //store the wave choice to judge the wave shift process reg [1:0] wave_choise_r; always@(posedge clk, negedge rst_n) begin if(rst_n==1'b0 ) wave_choise_r <= 2'd0; else wave_choise_r <= wave_choise; end //square wave reg [4:0] cnt_square; reg [4:0] wave_square; always@(posedge clk, negedge rst_n) begin if(rst_n == 1'b0 || wave_choise == 2'd1 || wave_choise == 2'd2 ) cnt_square <= 5'd0; else if(cnt_square == 5'd19) cnt_square <= 5'd0; else cnt_square <= 5'd1 + cnt_square; end /* always@(posedge clk, negedge rst_n) begin if(rst_n==1'b0) wave_square <= 5'd0; else if(cnt_square <= 5'd8) wave_square <= 5'd0; else if(wave_choise == 2'd0 && cnt_square >= 5'd9) wave_square <= 5'd20; end */ always@(*) begin if(rst_n==1'b0) wave_square = 5'd0; else if(cnt_square <= 5'd9) wave_square = 5'd0; else if(wave_choise == 2'd0 && cnt_square > 5'd9) wave_square = 5'd20; end //zigzag wave /* reg [4:0] cnt_zigzag; reg [4:0] wave_zigzag; always@(posedge clk, negedge rst_n) begin if(rst_n==1'b0 || wave_choise != 2'd1) cnt_zigzag <= 5'd0; else if(cnt_zigzag < 5'd20 && wave_choise == 2'd1) cnt_zigzag <= 5'd1 + cnt_zigzag; else if(cnt_zigzag == 5'd20) cnt_zigzag <= 5'd0; end always@(*) begin if(rst_n == 1'b0 || wave_choise != 2'd1) wave_zigzag = 5'd0; else if(cnt_zigzag == 5'd20) wave_zigzag = 5'd0; else if(wave_choise == 2'd1 && cnt_zigzag < 5'd20) wave_zigzag = 5'd1 + wave_zigzag; end */ reg [4:0] wave_zigzag; always@(posedge clk, negedge rst_n) begin if(rst_n==1'b0 || wave_choise != 2'd1 || wave_choise_r != 2'd1) wave_zigzag <= 5'd0; else if(wave_zigzag < 5'd20 && wave_choise == 2'd1) wave_zigzag <= 5'd1 + wave_zigzag; else if(wave_zigzag == 5'd20) wave_zigzag <= 5'd0; end //trangular wave reg incr_flag; reg [4:0] wave_trangular; always@(posedge clk, negedge rst_n) begin if(rst_n==1'b0 || wave_choise != 2'd2) wave_trangular <= 5'd0; else if(wave_choise == 2'd2) begin if ( wave_choise == 2'd2 && wave_choise_r[1:0]==2'd0) wave_trangular <= wave_square - 5'd1; else if( wave_choise == 2'd2 && wave_choise_r[1:0]==2'd1) wave_trangular <= wave_zigzag - 5'd1; else if( wave_choise == 2'd2 && wave_choise_r[1:0]==2'd2) begin if (incr_flag) wave_trangular <= wave_trangular + 5'd1 ; else wave_trangular <= wave_trangular - 5'd1 ; end end end /* always@(posedge clk, negedge rst_n) begin if(rst_n == 1'b0 || wave_choise != 2'd2) incr_flag <= 1'b0; else if(wave_trangular == 5'd19) incr_flag <= 1'b0; // is there = 19 or 20 ,this is a point, it must judge befor one cycle else if(wave_trangular == 5'd1) incr_flag <= 1'b1; else if((wave_choise == 2'd2) && (wave_choise_r == 2'd1 || wave_choise_r == 2'd0)) incr_flag <= 1'b0; end */ always@(*) begin if(rst_n == 1'b0 || wave_choise != 2'd2) incr_flag = 1'b0; else if(wave_choise == 2'd2) begin if(wave_choise_r == 2'd1 || wave_choise_r == 2'd0) incr_flag = 1'b0; else if (wave_trangular == 5'd20) incr_flag = 1'b0; // judgement condiation is no need to bring ahead one cycle else if(wave_trangular == 5'd0) incr_flag = 1'b1; end else incr_flag = 1'b0; end //there is a tough problem when the form transfrom /* always@(posedge clk, negedge rst_n) begin if (rst_n == 1'b0 ) wave <= 5'd0; else begin case(wave_choise) 2'd0: wave <= wave_square; 2'd1: wave <= wave_zigzag; 2'd2: begin //wave shift if((wave_choise == 2'd2) && (wave_choise_r == 2'd2) ) wave <= wave_trangular; else if((wave_choise == 2'd2) && (wave_choise_r == 2'd0)) wave <= wave_square; else if((wave_choise == 2'd2) && (wave_choise_r == 2'd1)) wave <= wave_zigzag; end default wave <= wave_square; endcase end end */ always@(*) begin if (rst_n == 1'b0 ) wave = 5'd0; else begin case(wave_choise) 2'd0: begin if(wave_choise_r == 2'd2) wave = wave_trangular; else if (wave_choise_r == 2'd0) wave = wave_square; else if (wave_choise_r == 2'd1) wave = wave_zigzag; else wave = wave_square; end 2'd1: begin if(wave_choise_r == 2'd2) wave = wave_trangular; else if (wave_choise_r == 2'd0) wave = wave_square; else if(wave_choise_r == 2'd1) wave = wave_zigzag; else wave = wave_zigzag; end 2'd2: begin if(wave_choise_r == 2'd2) wave = wave_trangular; else if(wave_choise_r == 2'd0) wave = wave_square; else if(wave_choise_r == 2'd1) wave = wave_zigzag; else wave = wave_trangular; end default wave = wave_square; endcase end end endmodule
