OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3730|回复: 2

[XILINX] 关于vivado综合错误的问题

[复制链接]

18

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2022-10-7
在线时间
70 小时
发表于 2023-2-16 18:56:22 | 显示全部楼层 |阅读模式
15金钱
module key_filter(
    input sys_clk,
    input sys_rst,
    input key_in,
    output key_flag,
//    output key,
    output reg key_state
);
reg [1:0]state;
reg [24:0]counter ;  
reg count_en;  
wire posedge_state;
wire negedge_state;
parameter CNT = 25'd1000_000 - 1'd1; // 20ms
reg key_f_flag;
reg key_r_flag;
//assign key_flag = key_f_flag | key_r_flag ;
assign key_flag = key_r_flag;

//计数器    (可以考虑在状态机里让counter自增,更加简洁)
always@(posedge sys_clk or negedge sys_rst)begin
    if(!sys_rst)
        counter <= 0;
    else if(count_en)begin
        if (counter == CNT)
            counter <= 0;
        else if (state == 1 && posedge_state)
            counter <= 0;
        else if (state == 3 && negedge_state)
            counter <= 0;
        else
            counter <= counter + 1'd1;
    end
    else
        counter <= 0;
end


reg state1,state0;

assign negedge_state = (state0 && !state1) ? 1 : 0; //下降沿检测
assign posedge_state = (!state0 && state1) ? 1 : 0;//上升沿检测
always@(posedge sys_clk or negedge sys_rst)begin
    if(!sys_rst)
        state1 <= 0;
    else
        state1 <= key_in;
end
always@(posedge sys_clk or negedge sys_rst)begin
    if(!sys_rst)
        state0 <= 0;
    else
        state0 <= state1;
end


always@(posedge sys_clk or negedge sys_rst)begin
    if(!sys_rst)begin
        state <= 0;
        count_en <= 1;
        key_f_flag <= 0;
        key_r_flag <= 0;
        key_state <= 1;
    end
    else case (state)
        0: if(negedge_state)begin // 释放稳定 or 平稳态
                state <= 1;
                count_en <= 1;
            end
            else begin
                state <= 0;
                key_r_flag <= 0;
                key_state <= 1;
           end     
        1: if(counter == CNT)begin //滤除抖动
                state <= 2;
                key_f_flag <= 1;
                count_en <= 0;
           end
           else if(posedge_state)begin
                state <= 0;
                count_en <= 0;
           end
           else
                state <= 1;
        2: if(posedge_state)begin  // 按下稳定状态
                state <= 3;
                count_en <= 1;
           end
           else begin
                state <= 2;
                key_f_flag  <= 0;
                key_state <= 0;
           end     
        3: if(counter == CNT)begin // 滤除抖动
                state <= 0;
                key_r_flag <= 1;
                count_en <= 0;
           end
           else if (negedge_state == 1)begin
                state <= 2;
                count_en <= 0;
           end
           else
                state <= 3;
         default:  ;
         endcase   
end
endmodule


这是我按键消抖的代码,例化到其他模块综合电路后出现了以下警告

      
  • [Synth 8-6859] multi-driven net on pin Q with 1st driver pin 'u_key_filter_1/counter_reg[24]

      
  • [Synth 8-6858] multi-driven net Q is connected to at least one constant driver which has been preserved, other driver is ignored
  • 请问是什么原因?


最佳答案

查看完整内容[请看2#楼]

参考一下这个链接 https://support.xilinx.com/s/question/0D52E00006hplltSAA/synth-86859-multi-driven-net-on-pin-output-error?language=ja
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2022-5-24
在线时间
22 小时
发表于 2023-2-16 18:56:23 | 显示全部楼层
回复

使用道具 举报

18

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2022-10-7
在线时间
70 小时
 楼主| 发表于 2023-2-21 10:07:52 | 显示全部楼层
HUANGweicong 发表于 2023-2-17 10:39
参考一下这个链接
https://support.xilinx.com/s/question/0D52E00006hplltSAA/synth-86859-multi-driven- ...

好的谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-10-4 04:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表