题目
请编写一个信号发生器模块,根据波形选择信号wave_choise发出相应的波形:wave_choice=0时,发出方波信号;wave_choice=1时,发出锯齿波信号;wave_choice=2时,发出三角波信号。
模块的信号接口图如下:
模块的时序图如下:
请使用Verilog HDL实现以上功能。
信号 | 类型 | 输入/输出 | 位宽 | 描述 |
---|---|---|---|---|
clk | wire | Intput | 1 | 系统时钟信号 |
rst_n | wire | Intput | 1 | 异步复位信号,低电平有效 |
wave_choise | wire | Intput | 2 | 2比特位宽的信号,根据该信号的取值不同,输出不同的波形信号 |
wave | reg | Intput | 5 | 5比特位宽的信号,根据wave_choise的值,输出不同波形的信号 |
答案
`timescale 1ns/1ns
module signal_generator(
input clk,
input rst_n,
input [1:0] wave_choise,
output reg [4:0]wave
);
reg [4:0] cnt1;
reg up;
always @(posedge clk or negedge rst_n)
if(!rst_n)
cnt1 <= 'd0;
else if(wave_choise== 2'd0)
if(cnt1=='d19)
cnt1 <= 'd0;
else
cnt1 <= cnt1 + 1'd1;
else
cnt1 <= 'd0;
always @(posedge clk or negedge rst_n)
if(!rst_n)
up <= 1'b0;
else if(wave_choise==2'd2)
if(wave=='d20)
up <= 1'b0;
else if(wave=='d0)
up <= 1'b1;
else
up <= up;
else
up <= 1'b0;
always @(posedge clk or negedge rst_n)
if(!rst_n)
wave <= 'd0;
else
case(wave_choise)
2'b00: //方波
begin
if(cnt1=='d19)
wave <= 'd0;
else if(cnt1 == 'd9)
wave <= 'd20;
else
wave <= wave;
end
2'b01: //锯齿波
begin
if(wave=='d20)
wave <= 'd0;
else
wave <= wave + 1'd1;
end
2'b10: //三角波
begin
if(wave == 'd20)
begin
wave <= wave - 1'd1;
end
else if(wave == 'd0)
begin
wave <= wave + 1'd1;
end
else if(up)
wave <= wave + 1'd1;
else
wave <= wave - 1'd1;
end
default:wave <= 'd0;
endcase
endmodule