题解 | #信号发生器#

信号发生器

http://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
	);
    parameter [4:0] CLK_NUM = 5'd19;
//-------------wire define------------//
    
//-------------reg define-------------//
    reg [4:0] clk_cnt;   
    reg triangle_flag;
//     reg mode_shift;
//************************************//
//           Main code
//************************************//
//clk counter
always @ (posedge clk,negedge rst_n)
    begin
        if(!rst_n)
            clk_cnt <= 5'b0;
        else if(clk_cnt == CLK_NUM)
            clk_cnt <= 5'b0;
        else
            clk_cnt <= clk_cnt + 1'b1;
    end
// // 0 --> 1模式切换标志
// always @ (posedge clk,negedge rst_n)
//     begin
//         if(!rst_n)
//             mode_shift <= 1'b0;
//         else if(wave_choise == 2'b01)
//             mode_shift <= 1'b1;
//         else
//             mode_shift <= 1'b0;
//     end    
// //output
    always @ (posedge clk,negedge rst_n)
        begin
            if(!rst_n)
                begin
                    wave <= 5'b0;
                    triangle_flag <= 1'b0;
                end
            else
                case(wave_choise)
                    2'b00:begin
                        if(clk_cnt == 5'd9)
                            wave <= 5'd20;
                        else if(clk_cnt == CLK_NUM)
                            wave <= 5'd0;
                        else
                            wave <= wave;
                    end
                    2'b01:begin
                        wave <= wave==5'd20 ? 5'd0 : wave + 1'b1;
                    end
                    2'b10:begin
                        if(triangle_flag)
                            begin
                                wave <= wave + 1'b1;
                                triangle_flag <= wave==5'd19 ? ~triangle_flag : triangle_flag;
                            end
                        else
                            begin
                                wave <= wave - 1'b1;
                                triangle_flag <= wave==5'd1 ? ~triangle_flag : triangle_flag;
                            end
                    end
                    default:wave <= 5'b0;
                endcase
        end
    
  
endmodule

全部评论

相关推荐

高斯林的信徒:武大简历挂?我勒个骚岗
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务