当前位置:   article > 正文

Verilog 条件语句if else_verilog if else

verilog if else

注意

  1. 只能在initial或always过程块语句中使用。

  2. 生成latch
    在时序逻辑中,不完整的 if…else… 结构并不会生成锁存器,而组合逻辑中不完整的 if…else… 结构就会生成锁存器。
    所以时序逻辑可以没有最后的else,默认保持;组合逻辑必须有else

  3. 组合逻辑中为了保持不变出现赋值语句:a =a,会出现锁存器。

  4. (这条有问题,后面再看)同一个变量的不同条件,用:

if
else if 
else
  • 1
  • 2
  • 3

不同变量的条件,需要嵌套:

if
	if
	else
else
  • 1
  • 2
  • 3
  • 4

例.(背景详见“基于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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

在这里插入图片描述

如果把cnt1的组合逻辑模块改成:

always@(*) begin
	if(cnt0 == 50-1)
	cnt1_n = cnt1 + 1;
	else if(cnt1 == 18-1)
	cnt1_n = 0;
	else 
	cnt1_n = cnt1;
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

逻辑上就是错的,当cnt1_n=17,下一个clk来,cnt1=17,立刻更新组合逻辑,虽然cnt0还未计数到49,但满足cnt1=17的条件,cnt1_n更新为0。再下一个clk,cnt1=0.
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/101489
推荐阅读
相关标签
  

闽ICP备14008679号