题目描述:
请编写一个信号发生器模块,根据波形选择信号wave_choise发出相应的波形:wave_choice=0时,发出方波信号;wave_choice=1时,发出锯齿波信号;wave_choice=2时,发出三角波信号。
模块的接口信号图如下
模块的时序图如下:
1.方波周期必须是20,占空比50%。用计数器实现时,幅值在计数为0-9时取0,10-19时取20。如果计数1-10时取0,11-19-0时取20,会出错,因为第一个周期持续时间不对。
2.锯齿波周期必须21,最大幅度20。切换波形模式时,直接递增wave(不用从头开始增加wave),直到幅度为20,再从头开始。
3.三角波周期必须40,最大幅度20。切换波形模式时,wave默认递减,除非进入三角波模式时wave=0,
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
`timescale 1ns/1ns
/*题目描述:
请编写一个信号发生器模块,根据波形选择信号wave_choise发出相应的波形:
wave_choice=0时,发出方波信号;
wave_choice=1时,发出锯齿波信号;
wave_choice=2时,发出三角波信号。
*/
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 @(posedge clk or negedge rst_n)
begin
if (!rst_n)
cnt<= 0 ;
else
begin
if (wave_choise== 0 )
begin
if (cnt>= 19 )
cnt<= 0 ;
else
cnt<=cnt+ 1 ;
end
else
cnt<= 0 ;
end
end
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
flag<= 1 ;
else
begin
if (wave_choise== 2 )
begin
if (wave== 19 )
flag<= 1 ;
else if (wave== 1 )
flag<= 0 ;
else
flag<=flag;
end
else
begin
if (wave== 0 )
flag<= 0 ;
else
flag<= 1 ;
end
end
end
always @(posedge clk or negedge rst_n)
begin
if (!rst_n)
wave<= 0 ;
else
begin
if (wave_choise== 0 )
begin
wave <= cnt< 9 ? 0 :
cnt< 19 ? 20 : 0 ;
end
else if (wave_choise== 1 )
begin
wave <= wave>= 20 ? 0 : wave+ 1 ;
end
else if (wave_choise== 2 )
begin
wave <= flag== 1 ? wave- 1 : wave+ 1 ;
end
else
wave<= 0 ;
end
end
endmodule
|