在线咨询 切换到宽版
eetop公众号 创芯大讲堂 创芯人才网

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜帖子
查看: 4452|回复: 4

[求助] DC综合报错-Clock get used as data. (ELAB-305)

[复制链接]
发表于 2017-6-28 14:33:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
DC综合时,报错,但是这个get信号不是时钟信号,逻辑哪里出了问题?求大神指导怎么修改。NAME
       ELAB-305 (error) %s Clock %s used as data.


DESCRIPTION
       You  receive  this  error  message because Presto HDL Compiler does not
       allow clock signals to be used for purposes other than clocking.


WHAT NEXT
       Remove the unsupported code from your design.

verilog代码
module contral ( reset,                    
                get,cancel,
                money_all,//所需的总钱数               
                cin_all, //投入的总钱数
                 mout,//找零钱数
                                 zflag,//找零结束标志
                                 tflag,//出票结束标志
                finish,  //出钱信号
                finishp //出票信号
                                 );   
  input reset,zflag,tflag;                    
  input get,cancel;
  input[6:0] money_all;
  input [6:0] cin_all;


  output[6:0] mout;
  output finish,finishp;


  reg [6:0] mout;
  reg finish,finishp;               


//找零钱数计算部分  
always @ (negedge reset  or posedge cancel or posedge get or posedge zflag )//确认键和取消键应该是高脉冲,而不应该持续很长时间
begin
    if(!reset)
       begin
        mout <= 7'd0;
       end
    else
            if(cancel)
                  begin
          mout <= cin_all;
                  end
                else
                   if(zflag)
                    begin
             mout <=7'd0 ;
                     end
                    else
                     if((get == 1)&&(cin_all < money_all))
                begin
                 mout <= cin_all;//当钱数不够时是可以按确认时自动退出已投的钱,任意时刻均可以按取消即可退出所有已投的钱
                end
                         else                           
                if((get == 1)&&(cin_all >= money_all ))
                   begin
                   mout <= cin_all - money_all;//确认购票
                  end
                else
                   begin
                               mout <=7'd0;
                   end
end  

//找零结束,显示找零结束
always @ (negedge reset  or posedge cancel or posedge get or posedge zflag )
begin
    if(!reset)
       begin
        finish <= 1'b0;
       end
    else
            if(cancel)
                  begin
          finish <= 1'b1;
                  end
                else
                        if(zflag)
                    begin
            finish <= 1'b0;
                     end
                  else
                    if((get == 1)&&(cin_all < money_all))
             begin
              finish <= 1'b1;//当钱数不够时是可以按确认时自动退出已投的钱,任意时刻均可以按取消即可退出所有已投的钱
             end
                        else                           
                if((get == 1)&&(cin_all >= money_all ))
                   begin
                   finish <= 1'b1;
                  end
                else
                   begin
                   finish <= 1'b0;
                   end
end  


//投入的总钱数大于所需的钱数并且确认买票的时候显示找零信息
always @ (negedge reset  or posedge cancel or posedge get or posedge tflag)
begin
    if(!reset)
       begin
        finishp <= 1'b0;
       end
    else
            if(cancel)
                  begin
          finishp <= 1'b0;
                  end
                else
                  if(tflag)
                    begin
            finishp <= 1'b0;
                    end
                  else
            if((get == 1)&&(cin_all >= money_all ))
                begin
                finishp <= 1'b1;
                end
             else
                   begin
                   finishp <= 1'b0;
                   end
end  
endmodule
发表于 2017-6-29 11:21:48 | 显示全部楼层
dc报的问题,时钟做数据使用了。如你代码所写,get作为时钟信号且是上升沿有效,但是你的代码中又把get作为判断条件。这是不符合语法。先搞清楚,可综合的代码规则吧。
回复 支持 反对

使用道具 举报

发表于 2017-6-29 13:40:40 | 显示全部楼层
代码怎么能这样写!!!
一个模块中如果可以,只用一个时钟!!!
如果只是判定某个信号的跳变沿,用下面的方法:(假设要检测信号为signal_a)
reg   signal_a_r1;
always@(posedge clk or negedge rst_n)
begin
   if(~rst_n)
        signal_a_r1 <= 1'b0;
   else
        signal_a_r1 <= signal_a;
end

wire     signal_a_raise_edge;
wire     signal_a_fall_edge;

assign signal_a_raise_edge =  ~signal_a_r1 & signal_a;
assign signal_a_fall_edge = signal_a_r1 & ~signal_a;
回复 支持 1 反对 0

使用道具 举报

发表于 2017-6-29 13:44:37 | 显示全部楼层
像这种写法都死错误的:
always @ (negedge reset  or posedge cancel or posedge get or posedge zflag )

正确写法应该改为:
always@(posedge clk or negedge reset)
begin
    if(~reset)
        //code
    else if(cancel_raise_edge)
        //code
    else if(get_raise_edge)
        //code
    else if(zflag_raise_edge)
        //code
    //......
end
回复 支持 反对

使用道具 举报

发表于 2024-11-6 15:00:22 来自手机 | 显示全部楼层
时序逻辑还是组合逻辑
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐 上一条 /1 下一条

手机版| 小黑屋| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-8-10 14:05 , Processed in 0.016211 second(s), 3 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表