always @(posedge clk or negedge rst_n)
if(!rst_n) led_r <= 4'b0001;
else if(cnt24 == 24'hffffff && led_on) begin
if(led_dir) led_r <= {led_r[0],led_r[3:1]}; //left
else led_r <= {led_r[2:0],led_r[3]}; //right
end
always @(posedge clk or negedge rst_n)
if (!rst_n) key_rst <= 3'b111;
else key_rst <= {sw3_n,sw2_n,sw1_n};
我很纳闷为什么上电时rst_n就接在高电平了,为什么led_r的初值还是4'b0001,我就在想是不是FPGA上电初值都是0,程序是并行运行的,用的输入都是上个周期的值,说以才会一上电就led_r=4'b0001,但是我用波形仿真的时候,第一个周期led_r就等于4’b0001了,求解答。还有就是如果吧条件 改成if(rst_n) led_r <= 4'b0001;高电平复位,编译就会出错
我是初学小白,见笑了
在定义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[3:0]=4'b0001时,用波形仿真,当设定rst_n=1时,全程都是1没有0过,但一开始还是led_r[3:0]=4'b0001,应该和电路没什么关系
如果你没有定义led_r的初始值譬如4'b1111,而且综合时又选择了寄存器吸收优化, 那么led_r是可能被初始化为4'b0001的.
换句话说,你既然不介意led_r的初始值,也就意味着什么值都可以, 那它综合完为了节省资源,给你定个4'b0001未尝不可.
第二段是复制多了,原来是这样啊,刚学没注意到这个问题下降沿触发的问题
我是想问为什么led_r一上电就等于 4'b0001,rst_n在高电平,用仿真也是一开始就等于4'b0001,rst_n都在高电平,并没有赋值给led_r,为什么led_r一上电就等于4'b0001
初学小白,请指教