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