题目描述:
编写一个信号发生器模块,根据波形选择信号wave_choise发出相应的波形:wave_choice=0时,发出方波信号;wave_choice=1时,发出锯齿波信号;wave_choice=2时,发出三角波信号。
解析:
- 要想实现方波,可以看到,方波类似于时钟信号,在本题中,通过设计四分频电路的思路设计方波的产生,给波的峰值设置为10。
- 实现锯齿波:将wave的值在每个时钟上升沿加一,当加到峰值10时,将其清零,随后继续重复此步骤。
- 三角波形:对于三角波的产生,类似于锯齿波形,可以先让wave值升到峰值,随后在每个时钟上升沿减1即可,到0时又重新加1,需要注意的是,在0和峰值10之间,如何判断这个中间值是加还是减,为此,引入了一个信号up,可以看出,当wave为0时,后续应该加,所以将wave=0时刻,拉高up,在wave=10时,拉低up,通过up决定是加或是减。
代码实现:
`timescale 1ns/1ns
module tb();
reg clk, rst_n;
reg [1:0] wave_choise;
wire [4:0] wave;
signal_generator dut(.clk(clk), .rst_n(rst_n), .wave_choise(wave_choise), .wave(wave));
initial begin
clk <= 0;
forever begin
#5 clk <= ~clk;
end
end
initial begin
#2 rst_n <= 0;
#3 rst_n <= 1;
end
initial begin
#5 wave_choise = 0;
#500 wave_choise = 1;
#500 wave_choise = 2;
#2000 $stop;
end
endmodule
module signal_generator(input clk,
input rst_n,
input [1:0] wave_choise,
output reg [4:0]wave);
reg [4:0] cnt;
reg up;
always @(posedge clk or negedge rst_n)
if (!rst_n)
begin
cnt <= 5'b0;
wave <= 5'b0;
end
else begin
case (wave_choise)//dived_4 generate fangbo
2'b00: begin
if (cnt == 5'b00001) begin
wave <= 5'd10;
cnt <= cnt + 1'd1;
end
else if (cnt == 5'd3) begin
wave <= 4'd0;
cnt <= 5'd0;
end
else begin
wave <= wave;
cnt <= cnt + 1'd1;
end
end
2'b01: begin//generate juchi wave
if (wave == 5'd10)
wave <= 5'd0;
else
wave <= wave +1'b1;
end
2'b10: begin
if (wave == 5'd10) begin
wave <= wave - 1'd1;
up <= 1'd0;
end
else if (wave == 5'd0) begin
wave <= wave + 1'd1;
up <= 1'd1;
end
if (up)
wave <= wave +1'b1;
else
wave <= wave - 1'd1;
end
default: wave <= 5'd0;
endcase
end
endmodule