题解 | #信号发生器#

信号发生器

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] cnt;
	reg flag;
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)begin
			flag<=0;
			cnt<=0;
		end
		else if ( wave_choise == 0)begin
			if(cnt>=19)
				cnt<=0;
			else
				cnt<=cnt+1;
		end
		else if (wave_choise==2)begin
			if(wave<=1)
				flag<=1;
			else if(wave==19)
				flag<=0;

		end
	end
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			wave<=5'b0;
		else if( wave_choise == 0 )begin
			if(cnt<9)
				wave<=0;
			else if(cnt<19)//取到19的时候立即置零
				wave<=20;
			else
				wave<=0;
		end
		else if(wave_choise==1)begin
			if(wave<20)
				wave<=wave+1;
			else if(wave ==20)
				wave<=0;
		end
		else if(wave_choise==2)begin
			if(flag)
				wave<=wave+1;
			else
				wave<=wave-1;
		end

		
	end



  
endmodule

这个题忽略掉题目里少给的信息,比较困难的地方是想清楚时序

方波发生器,0-9位是低电平,10-19位是高电平,这里需要前计数器第8位输出低电平,第九位开始输出高电平(因为是非阻塞赋值所以看上去慢了一拍),实际上是第九位输出完成了低电平,才有了计数器增加到第九位。同理,计数器到19位时,计数器重新置零,但因为取到第19位时,已经完成了高电平输出。

锯齿波,通过wave数值自动计数,达到20时立即置零(区别,方波的19还需要等待cnt的判断,所以慢了一拍,但是锯齿波wave的20,也就是对应时钟第21个上升沿不需要在对cnt检测赋值,直接置零),实际上的周期是21

三角波,上升和下降的循环,因为有了标志位(flag)的赋值,所以也要想方波一样提前一拍进行处理。标志位flag为0,三角波为下降状态时,wave为1时更改flag,在wave==1时仍然也是先执行wave-1的操作(时钟上升沿触发期间flag保持0不变,确认flag为0进行wave-1操作,同时判断wave==1,进行flag置1操作)

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务