题目:
描述
题目描述:
请编写一个信号发生器模块,根据波形选择信号wave_choise发出相应的波形:wave_choice=0时,发出方波信号;wave_choice=1时,发出锯齿波信号;wave_choice=2时,发出三角波信号。
模块的接口信号图如下:
模块的时序图如下:
请使用Verilog HDL实现以上功能,并编写testbench验证模块的功能
输入描述:
clk:系统时钟信号
rst_n:异步复位信号,低电平有效
wave_choise:2比特位宽的信号,根据该信号的取值不同,输出不同的波形信号
输出描述:
wave:5比特位宽的信号,根据wave_choise的值,输出不同波形的信号
提交结果:
参考题解中第一个思路,信号发生器
(1)波形信号存在周期要求
(2)锯齿波产生
(3)三角波产生
`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@(negedge rst_n, posedge clk)begin
if (~rst_n)
cnt <= 0;
else
cnt <= wave_choise != 0 ? 0 :
cnt == 19 ? 0 :
cnt + 1;
end
always@(negedge rst_n, posedge clk)begin
if (~rst_n)
flag <= 0;
else
flag <= wave_choise != 2 ? 0 :
wave == 19 ? 0 :
wave == 1 ? 1 : flag;
end
always@(negedge rst_n, posedge clk) begin
if (~rst_n)
wave <= 0;
else begin
case(wave_choise)
0: wave <= cnt == 9 ? 20 :
cnt == 19 ? 0 : wave;
1: wave <= wave == 20 ? 0 : wave + 1;
2: wave <= flag ? wave + 1 : wave - 1;
default: wave <= 0;
endcase
end
end
endmodule
tb文件
`timescale 1ns/1ns
module testbench();
reg clk,rst_n;
reg [1:0]wave_choise;
wire [4:0]wave;
initial begin
$dumpfile("out.vcd");
$dumpvars(0,testbench);
clk = 0;
rst_n = 0;
#2 rst_n = 1;
end
initial begin
#100 $finish;
end
always #1 clk = !clk;
initial begin
wave_choise = 0;
#40 wave_choise = 1;
#40 wave_choise = 2;
end
signal_generator dut(
.clk(clk),
.rst_n(rst_n),
.wave_choise(wave_choise),
.wave(wave)
);
endmodule