【FPGA学习笔记】VL29 信号发生器


题目描述:

请编写一个信号发生器模块,根据波形选择信号wave_choise发出相应的波形:wave_choice=0时,发出方波信号;wave_choice=1时,发出锯齿波信号;wave_choice=2时,发出三角波信号。

       模块的接口信号图如下

 【FPGA学习笔记】VL29 信号发生器

 

 

 

       模块的时序图如下:

【FPGA学习笔记】VL29 信号发生器

 

 

【FPGA学习笔记】VL29 信号发生器
请使用Verilog HDL实现以上功能,并编写testbench验证模块的功能
 

输入描述:

clk:系统时钟信号
rst_n:异步复位信号,低电平有效
wave_choise:2比特位宽的信号,根据该信号的取值不同,输出不同的波形信号
 

输出描述:

wave:5比特位宽的信号,根据wave_choise的值,输出不同波形的信号
答:

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>=200     : wave+1;
            end
            else if (wave_choise==2)
            begin
                wave <= flag==1 ? wave-1: wave+1;
            end
            else
                wave<=0;
        end
    end
 
 
 
endmodule

原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/271399.html

(0)
上一篇 2022年7月3日
下一篇 2022年7月3日

相关推荐

发表回复

登录后才能评论