题解 | 信号发生器

題解裏面看了好幾個,都遺漏了方波和鋸齒波為0時轉三角波的情況,用以下仿真代碼跑會出現wave到31的情況

`timescale 1ns/1ns
module signal_generator(
	input clk,
	input rst_n,
	input [1:0] wave_choise,
	output reg [4:0]wave
	);


reg [5:0] cnt;
reg       rev;  
reg [1:0] wave_reg;  

always @(posedge clk or negedge rst_n)           
    begin                                     
        if(!rst_n) begin
            cnt<=6'd0;
        end else if(cnt == 6'd19) begin
            cnt<=6'd0;    
        end else if(wave_choise == 2'd0) begin
            cnt<=cnt + 1'b1;    
        end else begin
            cnt<=6'd0;
        end
    end

always @(posedge clk or negedge rst_n)           
    begin                                     
        if(!rst_n) begin
            rev<=1'b0;
        end else if(wave_choise == 2'd2 && wave == 5'd19) begin
            rev<=1'b0;    
        end else if(wave_choise == 2'd2 && wave == 5'd1) begin
            rev<=1'b1;        
        end else if(wave_choise == 2'd0 && cnt == 5'd19) begin
            rev<=1'b1;        
        end else if(wave_choise == 2'd0 && cnt != 5'd19) begin
            rev<=1'b0;        
        end else if(wave_choise == 2'd1 && wave == 5'd20) begin
            rev<=1'b1;        
        end else if(wave_choise == 2'd1 && wave != 5'd20) begin
            rev<=1'b0;        
        end
        
    end    

always @(posedge clk or negedge rst_n)           
    begin                                    
        if(!rst_n) begin                               
            wave <=5'd0;
        end else if(wave_choise == 2'd0) begin
            if (cnt == 6'd9) begin
                wave <=5'd20;
            end else if (cnt == 6'd19) begin
                wave <=5'd0;
            end                                
        end else if(wave_choise == 2'd1) begin
            if (wave == 5'd20) begin
                wave <=5'd0;
            end else begin
                wave <= wave + 1'b1; 
            end
        end else if(wave_choise == 2'd2) begin
                if (rev == 1'b1) begin
                    wave <= wave + 1'b1; 
                end else if (rev == 1'b0) begin
                    wave <= wave - 1'b1;
                end
            end                                                               
    end                                          
endmodule

或者這樣也可以吧

`timescale 1ns/1ns
module signal_generator(
	input clk,
	input rst_n,
	input [1:0] wave_choise,
	output reg [4:0]wave
	);


reg [5:0] cnt;
reg       rev;  
reg [1:0] wave_reg;  

always @(posedge clk or negedge rst_n)           
    begin                                     
        if(!rst_n) begin
            cnt<=6'd0;
        end else if(cnt == 6'd19) begin
            cnt<=6'd0;    
        end else if(wave_choise == 2'd0) begin
            cnt<=cnt + 1'b1;    
        end else begin
            cnt<=6'd0;
        end
    end

always @(posedge clk or negedge rst_n)           
    begin                                     
        if(!rst_n) begin
            rev<=1'b0;
        end else if(wave_choise == 2'd2 && wave == 5'd20) begin
            rev<=1'b0;    
        end else if(wave_choise == 2'd2 && wave == 5'd0) begin
            rev<=1'b1;        
        end
        
    end    

always @(posedge clk or negedge rst_n)           
    begin                                    
        if(!rst_n) begin                               
            wave <=5'd0;
        end else if(wave_choise == 2'd0) begin
            if (cnt == 6'd9) begin
                wave <=5'd20;
            end else if (cnt == 6'd19) begin
                wave <=5'd0;
            end                                
        end else if(wave_choise == 2'd1) begin
            if (wave == 5'd20) begin
                wave <=5'd0;
            end else begin
                wave <= wave + 1'b1; 
            end
        end else if(wave_choise == 2'd2) begin
                if (rev == 1'b1) begin
                    if (wave == 5'd20) begin
                        wave <= wave - 1'b1; 
                    end else begin
                        wave <= wave + 1'b1;   
                    end

                end else if (rev == 1'b0) begin
                    if (wave == 5'd0) begin
                        wave <= wave + 1'b1; 
                    end else begin
                        wave <= wave - 1'b1;   
                    end
                end
            end                                                               
    end                                          
endmodule

`timescale 1ns/1ns

module test_tb;

    reg clk;
    reg rst_n;
    reg [1:0] wave_choise;
    wire [4:0]wave;


    // 实例化被测试模块
    signal_generator uut (
        .clk(clk),
        .rst_n(rst_n),
        .wave_choise(wave_choise),
        .wave(wave)
    );

    // 生成时钟信号
    initial begin
        clk = 0;
        forever #5 clk = ~clk;  // 10ns 周期的时钟
    end

    // 测试过程
    initial begin
        // 初始化
        rst_n = 0;
        wave_choise = 0;
        #20;
        rst_n = 1; 
        #200
        
        wave_choise = 1; #200
        wave_choise = 2; #400
        wave_choise = 0; #200
        wave_choise = 2; #400       
        wave_choise = 1; #200
        wave_choise = 0; #100       
        
        wave_choise = 1; #100
        wave_choise = 2; #200
        wave_choise = 0; #100
        wave_choise = 2; #200       
        wave_choise = 1; #100
        wave_choise = 0; #150
        
        wave_choise = 1; #150
        wave_choise = 2; #150
        wave_choise = 0; #150
        wave_choise = 2; #150       
        wave_choise = 1; #150
        wave_choise = 0;         
        // 结束仿真
         #150 $finish;
    end



endmodule

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务