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

always@(posedgeCLK,negedgeRST)beginif(EN)//提示在这里出现错误Error:Can'telaboratetop-leveluser... 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在低电平时,其他按键就失效,应该怎么做?
展开
 我来答
microshuke
2011-03-24 · TA获得超过154个赞
知道小有建树答主
回答量:123
采纳率:0%
帮助的人:84.9万
展开全部
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(按了键)
加或者减
百度网友ca715b1
2011-03-24 · TA获得超过463个赞
知道小有建树答主
回答量:130
采纳率:0%
帮助的人:170万
展开全部
的确如楼下所说,我今天也遇到了这个错误,就是要将那个 if(!RST)放在你的always的第一句,否则就会提示这个错误。不好意思,我想当然了。
这个en应该是同步的,而你的rst信号是异步的,这样写不行。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
峥峥好
2011-03-24 · 超过31用户采纳过TA的回答
知道答主
回答量:114
采纳率:0%
帮助的人:0
展开全部
你有没有module和endmodule?
追问
你很幽默
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
数学的爱好者
2011-03-23
知道答主
回答量:12
采纳率:0%
帮助的人:1.7万
展开全部
我也遇到过,你加个begin再试试看
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式