题解 | #信号发生器#

信号发生器

https://www.nowcoder.com/practice/39f6766689cc448e928a0921d1d1f858

这道题是看别人题解做的,我只是把别人的思想实现一遍,顺便记录一下,加深自己的印象。

思路

方波的周期是20,锯齿波的周期是21,三角波的周期是40。波形图最高点的值是20。

方波

方波的值,要么是0,要么是20。需要一个计数器cnt,从0计数到19,当cnt在0~9之间,那wave值是0;当cnt在10~19之间,那wave的值是20。

锯齿波

锯齿波的值,从0开始递增,增加到20,就突然变成0,再重复此过程。

三角波

三角波,观察波形图可以看出,最开始它是下降的,下降到0后,又递增上升,上升到20后,又递减下降到0。重复此过程。

代码

`timescale 1ns/1ns
module signal_generator(
	input clk,
	input rst_n,
	input [1:0] wave_choise,
	output reg [4:0]wave
	);
	//需要一个计数器
	reg [4:0]cnt;
	reg [1:0]wave_choise_old;
	reg flag;//为0波下降 为1波上升
	//如果wave_choise变化,那cnt就要从头开始计数
	always @(posedge clk or negedge rst_n) begin
		if (!rst_n)begin
			wave_choise_old<=2'b0;
		end
		else begin
			if (wave_choise_old!=wave_choise)cnt<=5'b0;
			wave_choise_old<=wave_choise;
		end
	end

	always @(posedge clk or negedge rst_n) begin
		if (!rst_n)begin
			wave<=5'b0;
			cnt<=5'b0;
			flag<=1'b0;
		end
		else begin
			case(wave_choise)
				2'b00:begin//方波
					wave<= cnt==5'd9?20:cnt==19?0:wave;
					cnt<= cnt==5'd19?0:cnt+1;
				end
				2'b01:begin//锯齿波
					wave<= wave<5'd20?wave+1:0;
				end
				2'b10:begin//三角波
					if (!flag)wave<=wave-1;
					else wave<=wave+1;
					flag<= wave==5'd1?1:wave==5'd19?0:flag;
				end
			endcase
		end
	end
  
endmodule

全部评论

相关推荐

未知的命运:大佬这都找不到我还找啥啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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