题解 | #信号发生器#

信号发生器

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

自己做的时候几个误区以及需要注意的点:

1、 方波的周期是20,锯齿波的周期是21,三角波的周期是40。这个没有考虑到在波形上查一下,直接用的wave 5‘11111为最大值。

2、 方波三角波设置标志位时,没有想到直接让标志位只在该模式下生效,并设置初始值,正好也能很好解决三角波刚开始就直接下降。(本来三角波想的思路是:缓存前一个wave_choise为temp,如果(temp=1&&wave_choise==2)||wave==19的时候标志位设为wave <= wave-1的标志。考虑复杂了)

方波:

注意wave在什么时候翻转。设置一个计数器cnt,计数范围是0-19。该计数器仅在方波模式也就是wave_choise==0时工作

cnt值在0~9时,wave==20;当cnt值在10~19时,wave==0。也就是wave应在cnt==10时从0变为20。但由于非阻塞赋值,cnt==10时,wave应对cnt==9是否成立进行判断。cnt==19也是同样原因。

锯齿波

锯齿波比较简单。wave产生锯齿波时,需要从0增加到20,所以周期是21。 当wave增加到20时,清零。

三角波

三角波模式需要设置一个标志位flagflag仅在三角波模式也就是wave_chosie==2时工作。当flag==0时,wave减少;当flag==1时,wave增加。

由波形图得知,刚进入三角波模式时,wave是下降的,所以flag的默认值是0。wave在最小值0和最大值20时,flag应进行翻转。同样由于是非阻塞赋值,所以wave上升到19时,flag从1到0,也就是flag <= wave==19&&flag==1? 0: flagwave下降到1时,flag从0到1,也就是flag <= wave==1&&flag==0? 1: flag

参考大神的解法:注意使用三目运算符会很方便。

https://blog.nowcoder.net/n/f594993524b14f2caf8b568be11ad90a?f=comment

`timescale 1ns/1ns
module signal_generator(
	input clk,
	input rst_n,
	input [1:0] wave_choise,
	output reg [4:0]wave
	);

		reg t_singn ;
		reg [4:0] cnt;

	always@(posedge clk or negedge rst_n)begin
		if(~rst_n)
			wave <= 0;
		else if(wave_choise == 0)begin
			wave <= cnt==9?20:
					cnt==19?0:
					wave;
		end
		else if(wave_choise ==1)begin
			if(wave ==20)
				wave <=0;
			else
				wave <= wave + 1;
		end
		else if(wave_choise ==2)begin
			if(t_singn==0)
				wave <= wave-1;
			else 
				wave <= wave+1;
		end
		else
			wave <= 0;
	end

	
	always@(posedge clk or negedge rst_n)begin
		if(~rst_n)
			cnt <= 0;
		else
			cnt <= wave_choise!=0?0:
					cnt == 19?0:
					cnt+1;
	end
								
	always@(posedge clk or negedge rst_n)begin
		if(~rst_n)
			t_singn <= 0;
		else
			t_singn <= wave_choise!=2?0:
						wave ==1?1:
						wave ==19?0:
						t_singn;
	end
endmodule

全部评论

相关推荐

头像
03-26 13:44
南华大学 Java
在看面经的花生米很野蛮:这种情况下你当然要回答,你也是吗!!!!我超喜欢他的XXXXX
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务