不同形状信号产生电路

该博客介绍了如何使用Verilog设计一个信号发生器模块,根据输入的选择信号wave_choise生成不同波形。当wave_choise为0时,产生方波;为1时,产生锯齿波;为2时,产生三角波。方波通过四分频电路实现,锯齿波和三角波则通过计数和条件判断来生成。文中还给出了详细的代码实现和仿真波形。
摘要由CSDN通过智能技术生成

题目描述:

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

解析:

  1. 要想实现方波,可以看到,方波类似于时钟信号,在本题中,通过设计四分频电路的思路设计方波的产生,给波的峰值设置为10。
  2. 实现锯齿波:将wave的值在每个时钟上升沿加一,当加到峰值10时,将其清零,随后继续重复此步骤。
  3. 三角波形:对于三角波的产生,类似于锯齿波形,可以先让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

仿真波形

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

借问众神明.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值