sorliran1 发表于 2012-4-19 09:11:03

verilog Error:can't elaborate top-level user hierarchy???

reg [ 25:0 ] count_del ;
always @ ( posedge clk or negedge rst_n )
        if(!rst_n || key_out)   //其中key_out为检测的按键输入下降沿,检测到时为1,否则为0
                count_del<=26'h0000000 ;
        else if(count_del==26'd50000001)
                count_del <= 26'h0000000 ;
        else count_del <= count_del+1 ;

分析综合时,就出错:   Error:can't elaborate top-level user hierarchy

而写成:
reg [ 25:0 ] count_del ;
always @ ( posedge clk or negedge rst_n )
        if(!rst_n )               
                                 count_del<=26'h0000000 ;
        else if ( key_out )
                count_del<=26'h0000000 ;
        else if(count_del==26'd50000001)
                count_del <= 26'h0000000 ;
        else count_del <= count_del+1 ;
就没有错了,这是为什么?

lkl10800139 发表于 2012-4-19 13:10:01

管脚是否有重复定义?

mayiqing888 发表于 2012-4-20 09:35:17

always @ ( posedge clk or negedge rst_n )

因为这里边的negedge rst_n的问题导致的吧?你第一个算法里,同时检测两个信号的状态,可能会导致发生错误吧

wye11083 发表于 2012-4-20 13:23:38

(!rst_n || key_out)这个写法放在复位里是不可以的,虽然有的综合器可以综合,但是绝大多数都是不工作的!你自己说说!rst_n是什么东西,key_out是什么东西,你再把它们两个条件或是什么意思?而且你的符号也用错了,硬件的取反不是用!,而是用~,前者是算术取反,后者是逻辑取反。硬件不需要逻辑或,直接或就够了,逻辑或反而要多占用资源!写硬件不是写软件,别一切按着软件的格式写!
再说了,就看你这两句:

always @ ( posedge clk or negedge rst_n )
      if(!rst_n || key_out)   //其中key_out为检测的按键输入下降沿,检测到时为1,否则为0
你自己还不知道什么地方错了?你的条件列表中有key_out吗?你的 rst_n是下降沿有效,而key_out是上升沿有效,那我给你个任务,我给你一个FDCE,然后你用线把这两个东西给我连起来,OK?你能连起来而不用其它东西,那你是神了。

sorliran1 发表于 2012-4-21 10:14:34

wye11083 发表于 2012-4-20 13:23 static/image/common/back.gif
(!rst_n || key_out)这个写法放在复位里是不可以的,虽然有的综合器可以综合,但是绝大多数都是不工作的 ...

谢谢指点,感觉写硬件上很多思维没有转换过来,verilog写的时候,遇到了很多问题和错误,可能还是理解不透侧
页: [1]
查看完整版本: verilog Error:can't elaborate top-level user hierarchy???