怎么使用FPGA按键消抖模块(标签-ar|关键词-input)

问题遇到的现象和发生背景

img

img

将按键消抖模块连接到其他模块发现按键消抖模块没有输出

用代码块功能插入代码,请勿粘贴截图
//按键消抖模块
module key(
    input   wire    clk,
    input   wire    rst,
    input   wire    key_in,  // 按键输入

    output   reg     key_out  // 消抖后的按键, 1为按下
);


    parameter TIME_DELAY = 10;  // 延迟时间,20ms

    reg [19:0]   cnt_delay;  // 计数器
    wire         add_cnt;    // 是否计数
    wire         end_cnt;    // 是否完成一次计数

    reg          key_before;  // 前一个状态电平
    reg          key_now;     // 当前按键电平

    wire         flag_fall;   // 按下(开始抖动)标志
    reg          flag_timing;  // 在计时标志,1表示在(可)计时


    // 当前按键电平设置
    always @(posedge clk or negedge rst) begin
        if (!rst)
            key_now <= 1'b1;
        else
            key_now <= key_in;
    end

    // 前一个按键状态电平设置
    always @(posedge clk or negedge rst) begin
        if (!rst)
            key_before <= 1'b1;
        else
            key_before <= key_now;
    end

    // 前一状态为1,后一状态为0,开始抖动
    assign flag_fall = key_before & (~key_now);


    // 计时标志判断
    always @(posedge clk or negedge rst) begin
        if (!rst)
            flag_timing <= 1'b0;
        else if (flag_fall) // 开始计时
            flag_timing <= 1'b1;
        else if (end_cnt)  // 计时结束
            flag_timing <= 1'b0;
    end



    // 计数器
    always @(posedge clk or negedge rst) begin
        if (!rst)
            cnt_delay <= 20'd0;
        else if (add_cnt) begin   // 计数
            if (end_cnt)
                cnt_delay <= 20'd0;
            else
                cnt_delay <= cnt_delay + 1'd1;
        end
    end

    assign add_cnt = flag_timing;  // 在计时状态 计时
    assign end_cnt = ((cnt_delay==TIME_DELAY) && add_cnt);  // 计时结束标志




    // 消抖后的按键
    always @(posedge clk or negedge rst) begin
        if (!rst)
            key_out <= 1'b0;
        else if (end_cnt)
            key_out <= ~key_now;
        else
            key_out <= 1'b0;
    end

endmodule
//销售模块
module sell(
    input clk,
    input rst,
    input money_two,       //输入2元
    input money_ten,         //输入10元
    input commodity_A,    //商品A
    input commodity_B,      //商品B
    input get_commodity, 
    output reg led_money_two,           //投入币值1元亮灯
    output reg led_money_ten,           //投入币值2元亮灯
    output reg led_commodityA,       //选择商品1
    output reg led_commodityB,       //选择商品2
    output reg led_commodity_out,  //取出商品亮灯
    output reg led_remainder,
    output      [3:0] commodity_numA,
    output      [3:0] commodity_numB,
    output reg     [7:0] back_money,           //找回的钱
    output reg     [7:0] money,
    output reg     [7:0] commodity_price,
    output flga_A
            );
    
    parameter        s0 = 0,
                    s1 = 1,
                    s2 = 2,
                    s3 = 3;
    reg  AA;
    reg  BB;    
    reg [3:0]       numA = 2;
    reg [3:0]       numB = 5;
    reg flagA = 0;
    reg flagB = 0;
    reg fga;
    reg fgb;
    reg             out_flag;        //出货找零复位        
    reg [1:0]         state;            //状态机状态    
    reg [1:0]         state_x;

    reg             two;
    reg             ten;
    reg             get;                
    always@(posedge clk or negedge rst)
       begin
         if(!rst)
           begin
             AA<=0;
             BB<=0;
             two<=0;
             ten<=0;
             get<=0;
             fga<=0;
             fgb<=0;
             
           end
         else
           begin
            AA<=commodity_A;
            BB<=commodity_B;
            two<=money_two;
            ten<=money_ten;
            get<=get_commodity;
           end
       end
       
       
    always@(posedge clk or negedge rst)
      begin
        if(!rst)
          begin
            state<=s0;      
          end
        else
          begin
          state<=state_x;
          end      
      end
      
      
    always@(posedge clk or negedge rst)  
      begin
         case(state)
            s0: begin
                  if(AA||BB)
                     begin
                        if(AA)
                         begin
                          fga=1;
                          flagA=fga;
                         end
                        else if(BB)
                         begin
                          fgb=1;
                          flagB=fgb;
                         end
                        state_x=s1;
                     end
                  else 
                     begin
                        state_x = state;
                     end     
                end
            s1: begin
                    if(two)
                      begin
                        state_x=s2;
                      end
                    else if(ten)
                      begin
                        state_x=s2;
                      end
                    else
                      begin
                        state_x=state;
                      end
                end
            s2: begin
                  if(moneybegin
                        state_x=s1;
                     end
                   else if(money >= commodity_price)
                     begin
                        state_x = s3;
                     end
                   else 
                     begin
                        state_x = state;
                     end
                end
            s3: begin
                  if(get)
                    begin
                        state_x=s0;
                    end
                  else
                    begin
                        state_x=state;
                    end
                end
            default:
                begin
                        state_x=s0;
                end
        endcase
      end 
      
      
      
      always@(posedge clk or negedge rst)
         begin
                if(!rst)
                    begin
                        money<=0;
                    end
                else if(state==s0)
                    begin
                        money<=0;
                    end
                else if(state==s1)
                    begin 
                        if(two)
                            begin 
                                money<=money+2;
                            end 
                        else if(ten)
                            begin 
                                money<=money+10;
                            end 
                        else
                            begin
                                money<=money;
                            end
                    end
                else if(state==s2)
                    begin
                        money<=money;
                    end
                else if(state==s3)
                    begin
                        money<=money;
                    end
         end 
         
         
         
       always@(posedge clk or negedge rst) 
         begin
            if(!rst)
                begin
                    commodity_price<=0;
                    led_money_two<=0;
                    led_money_ten<=0;
                    led_commodityA<=0;
                    led_commodityB<=0;
                end
            else if(state==s0)
                begin
                    if(AA)
                        begin
                            commodity_price<=3;
                            led_commodityA<=1;
                            led_commodityB<=0;
                        end
                    else if(BB)
                        begin
                            commodity_price<=7;
                            led_commodityA<=0;
                            led_commodityB<=1;
                        end
                    else
                        begin
                            commodity_price<=0;
                            led_commodityA<=0;
                            led_commodityB<=0;
                        end
                end
            else if(state==s1||state==s2)
                begin
                    if(two)
                        begin
                            led_money_two<=1;                                                        
                            led_money_ten<=0;
                        end
                    else if(ten)
                        begin
                            led_money_two<=0;
                            led_money_ten<=1;
                        end
                end
            else if(state==s3)
                begin
                    commodity_price<=commodity_price;
                    led_money_two<=0;
                    led_money_ten<=0;
                    led_commodityA<=0;
                    led_commodityB<=0;
                    if(flagA&&get)
                     begin
                        numA<=numA-1;
                     end
                    else if(flagB&&get)
                     begin
                        numB<=numB-1;
                     end
                end
         end
         
         
         
    always@(posedge clk or negedge rst)
         begin
                if(!rst)
                    begin
                        back_money<=0;
                        led_commodity_out<=0;
                        led_remainder<=0;
                    end
                else if(state==s0)
                    begin
                        back_money<=0;
                        led_commodity_out<=0;
                        led_remainder<=0;
                    end
                else if(money>=commodity_price)
                    begin
                        back_money<=money-commodity_price;
                        led_commodity_out<=1;
                        led_remainder<=1;
                    end                    
         end
 assign commodity_numA = numA;
 assign commodity_numB = numB;
 assign flga_A=flagA;
 assign flga_A=flagA;
endmodule 
//顶层模块
module top(
            input   wire    clk,
            input   wire    rst,
            input   wire[4:0] key_in,
            input money_two,       //输入2元
            input money_ten,         //输入10元
            input commodity_A,    //商品A
            input commodity_B,      //商品B
            input get_commodity, 
            output reg led_money_two,           //投入币值1元亮灯
            output reg led_money_ten,           //投入币值2元亮灯
            output reg led_commodityA,       //选择商品1
            output reg led_commodityB,       //选择商品2
            output reg led_commodity_out,  //取出商品亮灯
            output reg led_remainder,
            output      [3:0] commodity_numA,
            output      [3:0] commodity_numB,
            output reg     [7:0] back_money,           //找回的钱
            output reg     [7:0] money,
            output reg     [7:0] commodity_price,
            output flga_A
            );
            wire [4:0] key;
            
            wire twoyuan,tenyuan;            //按键消抖后的信号
            wire  [7:0] back_money_top;           //找回的钱
            wire  [7:0] money_show_top;
            wire  [7:0] commodity_price_top;
            wire commodity_A_A;    //商品A
            wire commodity_B_B;      //商品B
            wire en_get;
            wire flag_A;
            
key k0(
        .clk            (clk),
        .rst          (rst),
        .key_in         (key_in[0]),  // 按键输入   
        .key_out        (twoyuan) 
        );

key k1(
        .clk            (clk),
        .rst          (rst),
        .key_in         (key_in[1]),  // 按键输入   
        .key_out        (tenyuan) 
        );    
        
key k2(
        .clk            (clk),
        .rst          (rst),
        .key_in         (key_in[2]),  // 按键输入   
        .key_out        (commodity_A_A) 
        );            
key k3(
        .clk            (clk),
        .rst          (rst),
        .key_in         (key_in[3]),  // 按键输入   
        .key_out        (commodity_B_B) 
        );
key k4(
        .clk            (clk),
        .rst          (rst),
        .key_in         (key_in[4]),  // 按键输入   
        .key_out        (en_get) 
        );            

sell due(
        .clk     (clk),
        .rst    (rst),
        .money_two    (twoyuan),
        .money_ten    (tenyuan),
        .commodity_A    (commodity_A_A),
        .commodity_B    (commodity_B_B),
        .get_commodity    (en_get),
        .led_money_two    (led_money_two),
        .led_money_ten    (led_money_ten),
        .led_commodityA    (led_commodityA),
        .led_commodityB    (led_commodityB),
        .led_commodity_out    (led_commodity_out),
        .led_remainder    (led_remainder),
        .commodity_numA    (commodity_numA),
        .commodity_numB    (commodity_numB),
        .back_money        (back_money_top),
        .money            (money_show_top),
        .commodity_price    (commodity_price_top),
        .flga_A            (flga_A)
        
        );
        
                    
endmodule
运行结果及报错内容

销售模块单独测试的话是没问题,但是一旦连接按键消抖模块就没有输出了