FPGA Verilog语法问题

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未尝不可.

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-04-10
1、你都是rst 负边沿触发了,你就不能判断 if(rst_n) 啦 …… 有边沿检测的都是时序电路,除非你改成组合电路,才能if(rst_n) ……

2、我看你这两个模块没有关联性啊,你的问题是什么啊 ……追问

第二段是复制多了,原来是这样啊,刚学没注意到这个问题下降沿触发的问题
我是想问为什么led_r一上电就等于 4'b0001,rst_n在高电平,用仿真也是一开始就等于4'b0001,rst_n都在高电平,并没有赋值给led_r,为什么led_r一上电就等于4'b0001

初学小白,请指教

第2个回答  2014-04-10
if(!rst_n) led_r <= 4'b0001;相当于led初始值赋值是1,不必纠结第一个时钟他到底是从4‘b0变成4’b1还是其他的。
第二个问题是,rst_n为高时为什么led值还是1,这个要看else if中条件是否满足了,如果还没有满足就相当于一个锁存器期,posedge clk时 led《=led,所以led的值没有变,当else if中条件满足时led被赋新的值
相似回答