verilog编写的两个奇怪现象
1.在执行always@(posedge Clk50Mhz or negedge RstN)
if(RstN)
begin
r_State<=4'd0;
r_RxDone<=1'd0;
r_RxData<=8'hff;
end
else if(……)
语句时报错如下:
“cannot match operand(s) in the condition to the corresponding edges in the enclosing event control of the always construct”
开始觉得原因可能是该程序逻辑混乱,既然negedge RstN,则if(RstN)就没意义了。但是我后面有else if语句,即使negedgeRstN后为低,也可以 在else if 的敏感语句中判断出来的啊,况且我的敏感列表中有Clk50Mhz,响应它可以的啊!
2. 在执行always@(posedge Clk50Mhz or negedge RstN)
if(!RstN)
begin
r_State<=4'd0;
r_RxDone<=1'd0;
r_RxData<=8'hff;//控制8个LED灯亮,为高时则亮。
end
else if(……)
系统上电后,就自动执行了r_RxData<=8'hff;可是我明明没有按下RstN键(按下时RstN==0,系统上电默认的RstN==1,我用代码测试过,文档也是这么给的,所以如果我不按下对应的该键时,不应该执行r_RxData<=8'h00的,即灯不该亮)后来,我直接在管脚分配上不给RstN分配输入引脚,上电后系统的8个灯仍然亮(当替换成r_RxData<=8'hff;时,灯不亮,说明该句确实是执行了),怎么回事呢?
以上两个问题求高手解答!
额,不懂,绑定~
if( ! RstN)
你reset 錯了
无知者无罪。
verilog 的每行代码都是与硬件相对应,不能凭想当然的去写。
你写的第一段根本就不可能有对应的硬件实现。
至于第二个问题。在电源电平有效但clk还没建立时,RsN为低电平,因此执行了前3行。
至于第一个问题是因为通过alway语句和if语句的组合综合出来是无用的逻辑,而非硬件不可实现。第二个问题是你的时钟信号上升沿比reset信号下降沿来的更早,所以建议上电复位和时钟触发分离开来,先单独复位,然后时钟触发。
硬件上电后先复位,所以执行了第一个if程序
谢谢!第一个问题经你这么说我懂了。 只是第二个问题如果clk没有建立,RstN因为上电后为高(已经测过),但如果执行前三行,则必须满足always的触发条件,但是此时都不满足。难道系统上电后RstN自动产生下降沿?谢谢~(注:RstN对应与fpga开发板的一个io口,即一个按键,不是系统的复位按钮)
谢谢~我看他们的代码大多数都是这么写的,即复位和时钟触发在一起,难道真要分开写?(注:RstN对应与fpga开发板的一个io口,即一个按键,不是系统的复位按钮)
It is negative edge of reset signal...
if(!RstN)
异步复位是不一定要看到下降沿的,只要出现:VDD已建立,RsN还没到逻辑1,clk还没建立(还没出现pos),这时就满足了RsN=0的条件;而不是非得看到RsN的neg。
最简单的办法
把信号RstN拉到管脚连上示波器去看看吧
ok,原来是这样啊,差不多接受了~
一般复位信号不和时钟一起作为触发条件,而是在时钟触发时判断是否复位信号有效,rst无效,则触发时钟模块,若有效,则不触发。即always @(posedge clk & !rst),只是你理解反了,而且复位信号是电平敏感的,在该电平模式下复位信号始终有效,不能用沿触发的方式去判断,你上次的rst判断好像用了沿判断方式,可能也是造成你无解的原因之一。在写语句的时候要知道相应的硬件是如何实现的,并且是否符合用户要求。
学无止境
