发布网友 发布时间:2022-05-16 13:28
共3个回答
热心网友 时间:2023-10-23 19:26
在定义led_r时给个初值看看, led_r[3:0]=4'b0000; 若还不行说明硬件电路导致的上电次序有问题, 有扰动或其它;
always里有同步复位,异步复位,上升沿复位,下降沿复位. 如果rst_n没有列在触发例表里, 你可以随便用if(rst_n)或if(!rst_n),这是异步复位. 但你写了例表意味着同步复位,所以就得用always @(posedge rst_n), 监测到rst_n上升沿执行下面程序.
"监测到下降沿时,如果信号为高", 这是永远也不存在的逻辑状态,所以有warning或error.
另外verilog应该有现成的移位运算符,包括逻辑左右移,算术左右移, 你查查,并确切掌握它.
追问1.在定义led_r时给个初值看看, led_r[3:0]=4'b0000; 若还不行说明硬件电路导致的上电次序有问题, 有扰动或其它;追答如果你没有定义led_r的初始值譬如4'b1111,而且综合时又选择了寄存器吸收优化, 那么led_r是可能被初始化为4'b0001的.
换句话说,你既然不介意led_r的初始值,也就意味着什么值都可以, 那它综合完为了节省资源,给你定个4'b0001未尝不可.
热心网友 时间:2023-10-23 19:27
1、你都是rst 负边沿触发了,你就不能判断 if(rst_n) 啦 …… 有边沿检测的都是时序电路,除非你改成组合电路,才能if(rst_n) ……
热心网友 时间:2023-10-23 19:27
if(!rst_n) led_r <= 4'b0001;相当于led初始值赋值是1,不必纠结第一个时钟他到底是从4‘b0变成4’b1还是其他的。