题解 | 信号发生器

信号发生器

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

`timescale 1ns / 1ns
module signal_generator (
    input clk,
    input rst_n,
    input [1:0] wave_choise,
    output reg [4:0] wave
);
    reg [4:0] cnt;
    reg [1:0] wave_choise_reg;
    reg flag;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            wave_choise_reg <= 0;
        end else begin
            wave_choise_reg <= wave_choise;
        end
    end
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            cnt <= 0;
        end else if (wave_choise != wave_choise_reg || cnt == 'd19) begin
            cnt <= 0;
        end else begin
            cnt <= cnt + 1;
        end
    end
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            flag <= 0;
        end else if (wave_choise == 'd2 && wave == 'd1) begin
            flag <= 1;
        end else if (wave == 'd19) begin
            flag <= 0;
        end
    end
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            wave <= 0;
        end else begin
            case (wave_choise)
                'd0: begin
                    if (cnt == 'd9) begin
                        wave <= 20;
                    end else if (cnt == 'd19) begin
                        wave <= 0;
                    end
                end
                'd1: begin
                    if (wave == 'd20) begin
                        wave <= 0;
                    end else begin
                        wave <= wave + 1;
                    end
                end
                'd2: begin
                    if (!flag) begin
                        wave <= wave - 1;
                    end else if (flag) begin
                        wave <= wave + 1;
                    end
                end
                default: wave <= 0;
            endcase
        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 [4:0] cnt;
    reg [1:0] wave_choise_reg;
    reg flag;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            wave_choise_reg <= 0;
        end else begin
            wave_choise_reg <= wave_choise;
        end
    end
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            cnt <= 0;
        end else if (wave_choise != wave_choise_reg || cnt == 'd19) begin
            cnt <= 0;
        end else begin
            cnt <= cnt + 1;
        end
    end
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            flag <= 0;
        end else if (wave_choise == 'd2 && wave == 'd1) begin
            flag <= 1;
        end else if (wave == 'd19) begin
            flag <= 0;
        end
    end
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            wave <= 0;
        end else begin
            case (wave_choise)
                'd0: wave <= (cnt == 'd9) ? 20 : ((cnt == 'd19) ? 0 : wave);
                'd1: wave <= (wave == 'd20) ? 0 : wave + 1;
                'd2: wave <= flag ? wave + 1 : wave - 1;
                default: wave <= 0;
            endcase
        end
    end

endmodule

矩形波生成时注意在第10个周期判断,更新第11个周期的wave值;

锯齿波和三角波等缓变波强烈依赖wave自身的值,可以得出存在反馈控制,同样观察波形我们看到,当wave=20时下一周期会跳变到0;

在三角波中我们需要另加一个反馈控制信号,这个信号是通过wave的2个值合成的,flag生效范围是当wave_choise=2时,观察波形发现,wave最小值为1(不是0),因此要用wave=1控制flag的0-1翻转,而1-0翻转的控制信号仍为wave=19

全部评论

相关推荐

09-10 15:05
已编辑
门头沟学院 游戏后端
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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