题解 | #信号发生器#
信号发生器
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
);
parameter S0=2'b00;
parameter S1=2'b01;
parameter S2=2'b10;
reg [4:0]temp;//记录一锯齿波最后一个点是不是0
reg [6:0]cnt2;
always@(posedge clk or negedge rst_n)begin
if(~rst_n)
cnt2<=0;
else if(wave_choise==2'd2)
if(cnt2==39)
cnt2<=0;
else if(temp==0)
cnt2<=cnt2+1;
else
cnt2<=0;
end
always@(posedge clk or negedge rst_n)begin
if(~rst_n)
temp<=0;
else if(wave_choise==2'd1)
temp<=wave+1;//正常打拍,temp比wave少一个周期
else if (wave_choise==2'd2)
if(temp==0)
temp<=0;
else
temp<=temp-1;
end
reg [4:0] cnt;
always@(posedge clk or negedge rst_n)begin
if(~rst_n)
cnt<=0;
else if(wave_choise==2'd0)
if(cnt==19)
cnt<=0;
else
cnt<=cnt+1;
else
cnt<=0;
end
always@(posedge clk or negedge rst_n)begin
if(~rst_n)
wave<=0;
else
case(wave_choise)
S0:begin
if(cnt==9)
wave<=20;
else if(cnt==19)
wave<=0;
end
S1:begin
if(wave==20)
wave<=0;
else
wave<=wave+1;
end
S2:begin
if(temp!==0)
wave<=wave-1;
else
if(cnt2<=19)
wave<=wave+1;
else if(cnt2>=20)
wave<=wave-1;
end
endcase
end
endmodule
这题比较有趣,需要注意的是从1进入2的状态时,要先看wave是否为0,为0则递增,不为0时要先减到0再递增,这里是用在1下寄存wave的值,由于会慢一拍,所以应该打拍的值加一才是wave的值,以temp的值做判断,temp减到0时,wave才可以自增,再一个需要注意wave在2下的周期为40,而不是41。从0到20上升部分21个时钟,从20下来19-1为19个时钟,一共40个时钟,之前以为是41个结果wave的值减到负数了。
查看14道真题和解析