题解 | #信号发生器#
信号发生器
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 max =19, half=9;
reg [4:0] sw_cnt;
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
sw_cnt <= 0;
else if(wave_choise == 0) begin
if(sw_cnt >= max)
sw_cnt <= 0;
else
sw_cnt <= sw_cnt +1;
end
else
sw_cnt <= 0;
end
//三角波
reg flag;//三角波标志信号
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
flag <= 1'b1;
else if(wave_choise ==2'd2) begin
if(wave == 1'b1) //这里从wave =1 -> flag=0 (wave此时减为0) -> wave+1 有两个时钟周期
flag <= 1'b0;
else if(wave == max)
flag <= 1'b1;
else
flag <= flag;
end
else begin
if(wave == 0)
flag <= 1'b0;
else
flag <= 1'b1;//进入三角波模式的时候如果wave不是0,先进入递减模式减到0
end
end
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
wave <= 5'd0;
else begin
if(wave_choise ==2'd0)
wave <= (sw_cnt < half) ? 5'd0:((sw_cnt >= max)?5'd0:max+1) ;//方波
else if(wave_choise ==2'd1)
wave <= (wave >= max+1) ? 5'd0 : (wave +1'b1); //锯齿波
else if(wave_choise ==2'd2)
wave <= (flag == 1) ? (wave-1'b1) : (wave+1'b1); //三角波
else
wave <= 5'd0;
end
end
endmodule