题解 | #信号发生器#
信号发生器
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操作)