赞
踩
注意
只能在initial或always过程块语句中使用。
生成latch
在时序逻辑中,不完整的 if…else… 结构并不会生成锁存器,而组合逻辑中不完整的 if…else… 结构就会生成锁存器。
所以时序逻辑可以没有最后的else,默认保持;组合逻辑必须有else
组合逻辑中为了保持不变出现赋值语句:a =a,会出现锁存器。
(这条有问题,后面再看)同一个变量的不同条件,用:
if
else if
else
不同变量的条件,需要嵌套:
if
if
else
else
例.(背景详见“基于FPGA的AD7928驱动”)
第一个计数器,生成sclk1MHz,基于FPGA系统clk50MHz,计数50次。第二个计数器,用来控制片选信号的时长,基于sclk,计数18次。
always @(posedge clk or negedge rst_n)begin if(!rst_n) cnt0 <= 0; else cnt0 <= cnt0_n; end always@(*) begin if(cnt0 == 50-1) cnt0_n = 0; else cnt0_n = cnt0 + 1; end always @(posedge clk or negedge rst_n)begin if(!rst_n) cnt1 <= 0; else cnt1 <= cnt1_n; end //分析要点在这段 always@(*) begin if(cnt0 == 50-1) begin //一个sclk if(cnt1 == 18-1) cnt1_n = 0; else cnt1_n = cnt1 + 1; end else cnt1_n = cnt1; end
如果把cnt1的组合逻辑模块改成:
always@(*) begin
if(cnt0 == 50-1)
cnt1_n = cnt1 + 1;
else if(cnt1 == 18-1)
cnt1_n = 0;
else
cnt1_n = cnt1;
end
逻辑上就是错的,当cnt1_n=17,下一个clk来,cnt1=17,立刻更新组合逻辑,虽然cnt0还未计数到49,但满足cnt1=17的条件,cnt1_n更新为0。再下一个clk,cnt1=0.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。