verilog 里面 在always 下有两个 if 语句 就出现如下错误 高手请进

always @ (posedge CLK,negedge RST)
begin
if(EN) // 提示在这里出现错误 Error: Can't elaborate top-level user hierarchy
if(!RST)
U <= 0;
else
if(CTRL)
begin
U <= U + 1;
if(U == 15) c_b <= 1;
else c_b <= 0;
end
else
begin
U <= U - 1;
if(U == 0) c_b <= 1;
else c_b <= 0;
end
end
对于 数学的爱好者 和 wangxuede220 所说的,很抱歉,我都试过了,不管用啊!
microshuke 能再具体详细解释一下吗?多谢了,为什么有这样情况出现,如果我想在EN在低电平时,其他按键就失效,应该怎么做?

verilog对边沿触发的逻辑有规定:
你写了negedge rst,就必须在always内的第一个if中写~rst的逻辑。就是你把if(en)写在rst下面就好了。
这样综合时推断的是一个异步复位的寄存器
-------------------------------
为什么语法要这么规定我也不知道。@()里面的第一项是时钟定义,第二项和第三项(如果有的话)是异步复位和异步置位,必须写在第一个if, else if里面(如果有第三项的话)。
你说的其他按键就一个ctrl了啊,if(en)写在ctrl前面就行了。追问

这里时钟也是一个按键,我现在做的是一个十进制 加/减 法器,CLK作为按键计数,RST起置零作用,EN我想用来作为使能,但always@()括号里又不能把EN加进去(加进去会有麻烦,因为是低电平动作,回到高电平要能继续工作就难办了)

追答

clk不能作为按键。
同步电路里需要有一个稳定的时钟驱动寄存器。
应该这样写
always@(posedge clk or negedge rst)
if(~rst)
清零
else if(按了键)
加或者减

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-03-24
的确如楼下所说,我今天也遇到了这个错误,就是要将那个 if(!RST)放在你的always的第一句,否则就会提示这个错误。不好意思,我想当然了。
这个en应该是同步的,而你的rst信号是异步的,这样写不行。
第2个回答  2011-03-24
你有没有module和endmodule?追问

你很幽默

第3个回答  2011-03-23
我也遇到过,你加个begin再试试看
相似回答