题解 | #信号发生器#

信号发生器

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

全部评论
我想请问下,用vivado仿真的时候怎么才能设置成看波形,而不是一串数字
点赞 回复 分享
发布于 2023-04-05 11:33 四川

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务