题解 | #信号发生器#

信号发生器

https://www.nowcoder.com/practice/39f6766689cc448e928a0921d1d1f858

本题的解法就是一个case语句就行,但是需要注意的是每个波形之间的转换,特别是在三角波的时候,其默认是减少的,但是也要看是否wave为0.
`timescale 1ns/1ns
module signal_generator(
	input clk,
	input rst_n,
	input [1:0] wave_choise,
	output reg [4:0]wave
	);
    
    
    reg    [4:0]    rec_cnt;
    reg             trig_flag;
    
    always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            begin
                wave <= 5'b0;
                rec_cnt <= 5'b0;
                trig_flag <= 1'b0;
            end
        else
            begin
                case(wave_choise)
                    2'd0    :    begin
                            if(rec_cnt == 5'd9)
                                begin
                                    wave <= 5'd20;
                                    rec_cnt <= rec_cnt + 1'b1;
                                end
                            else if(rec_cnt == 5'd19)
                                begin
                                    wave <= 1'b0;
                                    rec_cnt <= 5'b0;
                                end 
                            else
                                begin
                                    wave <= wave;
                                    rec_cnt <= rec_cnt + 1'b1;
                                end
                        end
                    2'd1    :    wave <= ((wave == 5'd20) ? 5'b0 : (wave + 1'b1));
                    2'd2    :    begin
                            if(wave == 5'd0)
                                begin
                                    trig_flag <= 1'b1;
                                    wave <= wave + 1'b1;
                                end
                            else if(wave == 5'd20)
                                begin
                                    trig_flag <= 1'b0;
                                    wave <= wave - 1'b1;
                                end
                            else
                                begin
                                    if(trig_flag)
                                        wave <= wave + 1'b1;
                                    else
                                        wave <= wave - 1'b1;
                                end
                        end
                    default :    wave <= 5'b0;
                endcase
            end
    end
    
  
endmodule

全部评论
三角波的产生,除了最小值0和最大值20,加减用标志位判断,trig_flag判断很简单
点赞 回复 分享
发布于 2022-09-23 17:09 湖南

相关推荐

评论
3
收藏
分享

创作者周榜

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