题解 | #信号发生器#
信号发生器
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时,清零。
三角波
三角波模式需要设置一个标志位flag
。flag
仅在三角波模式也就是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: flag
;wave
下降到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