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

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
EETOP诚邀模拟IC相关培训讲师 创芯人才网--重磅上线啦!
查看: 3960|回复: 4

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

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

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

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

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


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


[size=14.399999618530273px]WHAT NEXT
[size=14.399999618530273px]       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;
发表于 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 来自手机 | 显示全部楼层
时序逻辑还是组合逻辑
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-12-22 13:49 , Processed in 0.037162 second(s), 7 queries , Gzip On, Redis On.

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