Verilog Tutorial(7)If语句和Case语句

这篇具有很好参考价值的文章主要介绍了Verilog Tutorial(7)If语句和Case语句。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

在自己准备写verilog教程之前,参考了许多资料----FPGA Tutorial网站的这套verilog教程即是其一。这套教程写得不错,只是没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。

这是网站原文:https://fpgatutorial.com/verilog/

这是系列导航:Verilog教程系列文章导航


这篇文章将讨论 verilog 中两个最常用的结构----if语句和case语句。

在之前的文章中学习了如何使用过程块(例如always块)来编写按顺序执行的verilog 代码。此外还可以在过程块中使用许多语句----统称为顺序语句,如case 语句和 if 语句。

这篇文章将讨论如何在 verilog 中使用这两个语句,然后,针对这两种语句构造一个简短的示例,以展示如何在实践中使用它们。

1、Verilog If 语句

if 语句是一种条件语句,它使用布尔条件来确定要执行哪些 verilog 代码。每当条件判定为时,就执行与该条件对应的代码分支,反之亦然。此语句类似于其他编程语言(如C语言)中所使用的条件语句if。

下面的 verilog 代码片段展示了 if 语句的基本语法。

if (<expression1>) begin
  //要执行的代码
end

else if (<expression2>) begin
  //要执行的代码
end

else begin
  //要执行的代码
end

如果不需要,可以从语句中排除 else 和 else-if 分支。当然,设计者也可以根据需要包含尽可能多的 else-if 分支以正确实现底层电路。

在上面的代码片段中,这些表达式由<expression1> <expression2> 给出。这些表达式按顺序计算,如果表达式的计算结果为,则执行与表达式关联的代码;反之亦然。

if 语句中只有一个分支会被执行----通常是第一个计算结果为真的表达式。唯一的例外是当所有表达式都不为真时,在这种情况下,将执行 else 分支中的代码。

与每个分支关联的代码可以包括任何有效的 verilog 代码,包括下一级的 if 语句----这种方法称为嵌套式 if 语句。

在 verilog 中使用此类代码时,应该注意限制嵌套语句的数量,因为它会导致难以满足时序要求。

If 语句示例

接下来将以用异步复位的D触发器实现的多路选择器作为示例讲解如何使用if语句。

下面的电路图是该示例的电路。

Verilog Tutorial(7)If语句和Case语句

下面的代码片段展示了如何使用一个 always 块和一个 if 语句来实现预期功能。

always @(posedge clock, posedge reset) begin
  if (reset) begin
    Q <= 1'b0;
  end
  else begin
    if (addr) begin
      Q <= b;
    end
    else begin
      Q <= a;
    end
  end
end

此示例使用的第一个 if 语句在复位时将触发器的输出设置为 0。当复位未使能且always 块被时钟的上升沿触发时----使用第一个 if 语句的 else 分支来处理这种情况。

第二个 if 语句用来实现多路选择器电路的功能---这是 verilog 中嵌套式 if 语句的示例。

当addr信号为0时,输入a的值将赋给触发器的输出,嵌套 if 语句的第一个分支将用来捕获此情况。然后,嵌套 if 语句的 else 分支被用来捕获 addr 信号为 1 的情况。

当然也可以在这里使用 else-if 类型的语句,但是 else 语句更简洁。这两种情况下的行为是相同的,因为在真实电路中信号只能是 0或 1。

2、Verilog Case语句

verilog中的case 语句根据设计中给定信号的值选择要执行的代码块。在 verilog 中编写 case 语句时,先要指定了一个要进行判断的输入信号,然后将此信号的值与 case 语句的每个分支中指定的值进行比较。一旦找到该值的匹配项,就执行该值关联的代码分支。

Verilog case 语句和C语言等编程语言中的 switch 语句功能类似。

下面的代码片段展示了 verilog 中 case 语句的一般语法。

case (<variable>)
  <value1> : begin
    //当<variable> = <value1>时执行这条语句
  end
  <value2> : begin
    //当<variable> = <value2>时执行这条语句
  end
  default : begin
    //其他条件是执行这条语句
  end
endcase

可以不使用语句的default分支----但不推荐。如果不使用语句的default分支,就应该把<variable>所有有效值都列举出来

与 if 语句一样,与每个分支关联的代码可以包含任何有效的 verilog 代码。这包括下一级的顺序语句,例如 if 或 case 语句。同样,设计者也应该尽量限制嵌套语句的数量,不然设计的时序要求会是个问题。

Case语句示例

为了更好地演示在 verilog 中使用 case 语句的方式,请考虑这样的一个基本示例----简单的4选1多路选择器电路

case 语句经常被用来在 verilog 中实现大型的多路选择器,因为它产生的代码比基于连续赋值的实现方式更具可读性

下面的电路图展示了本例中所使用的电路。

Verilog Tutorial(7)If语句和Case语句

下面的代码片段展示了如何使用 case 语句来实现这个电路。

always @(*) begin
  case (addr)
    2'b00 : begin
      q = a;
    end
    2'b01 : begin
      q = b;
    end
    2'b10 : begin
      q = c;
    end
    default : begin
      q = d;
    end
  endcase
end

此示例展示了使用 verilog 中的 case 语句实现多路选择器是多么简单的一件事。事实上,case 语句是在 verilog 中实现多路选择器的最直观方法。

在这个例子中要注意的是使用了阻塞赋值,这样做的原因是要实现组合逻辑电路,非阻塞赋值则通常会导致在设计中生成触发器。要注意的另一件事是这个例子中可以删除 default 关键字----但应该显式地列出输出 d 值所需的所有潜在的 addr 值。


  • 📣您有任何问题,都可以在评论区和我交流📃

  • 📣本文由 孤独的单刀 原创,首发于CSDN平台🐵,博客主页:wuzhikai.blog.csdn.net

  • 📣您的支持是我持续创作的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏文章来源地址https://www.toymoban.com/news/detail-409873.html


到了这里,关于Verilog Tutorial(7)If语句和Case语句的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Verilog 不完整if-else和case产生锁存latch

    写这篇文章是因为本小白在刷题过程中看到答主的代码总是不把if-else写全,而我又记得不写全是可能产生latch的,对此很迷惑,仔细看过之后发现只有组合逻辑(电平触发)电路中的不完整if-else和case才会产生锁存器latch。简单记录一下。 参考文章: 1、https://blog.csdn.net/ainu

    2024年02月13日
    浏览(51)
  • Verilog基础语法(13)之case语句

    case语句检查给定的表达式是否与列表中的其他表达式之一相匹配,并据此进行分支。它通常用于实现一个多路复用器。 如果要检查的条件很多,if-else结构可能不合适,因为它会综合成一个优先编码器而不是多路复用器。 一个Verilog case语句以case开始,以endcase结

    2024年02月14日
    浏览(31)
  • Mybatis 常用条件语句,大于小于、if、for、模糊搜索、case when、choose

    目录 大于小于 if 条件判断  for循环 LIKE 模糊搜索 case when choose选择语句 前言-与正文无关         生活远不止眼前的苦劳与奔波,它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中,我们往往容易陷入工作的漩涡,忘记了停下脚步,感受周围的世

    2024年02月01日
    浏览(63)
  • Verilog中if 语句与wait语句的区别

    (1) if语句是非阻塞语句 ,在initial语句中遇到 if 语句时,会判断条件是否成立,如果if条件成立,将会执行if条件成立后的语句;如果if 语句不成立,那么if后面的语句将会跳过而不执行。不会阻塞后面语句的执行,所以它是非阻塞语句。 (2) wait语句是阻塞语句 ,遇到

    2024年02月14日
    浏览(23)
  • 【Linux】Shell脚本之流程控制语句 if判断、for循环、while循环、case循环判断 + 实战详解[⭐建议收藏!!⭐]

    👨‍🎓 博主简介   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊 交流社区: 运维交流社区 欢迎大家的加入! 🐋 希望大家多多支持,我们一起进步!😄 🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏

    2024年02月13日
    浏览(37)
  • hdlbits系列verilog解答(always块if语句)-31

    if 语句通常创建一个 2 对 1 多路复用器,如果条件为 true,则选择一个输入,如果条件为 false,则选择另一个输入。 always @(*) begin if (condition) begin out = x; end else begin out = y; end end 这等效于使用带有条件运算符的连续赋值: assign out = condition ? (x : y); 使用if语句不当时会产生不想

    2024年02月06日
    浏览(28)
  • 【算法笔记】求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

    求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等及条件判断语句(A?B:C)、位运算、递归、公式、sizeof。 习题链接:题目链接 该题把我们的所有能用的方法都给限制死了,我们只能用一些的特殊的方法来做。不知道大家在思考的过程中考没考虑过

    2024年02月07日
    浏览(48)
  • Verilog Tutorial(1)如何编写一个基本的 Verilog Module(模块)

    在自己准备写verilog教程之前,参考了许多资料----FPGA Tutorial网站的这套verilog教程即是其一。这套教程写得不错,只是没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。 这是网站原文:https://fpgatutorial.com/verilog/ 这是系列导航:Verilog教程系列文章导航 这篇文

    2024年02月02日
    浏览(24)
  • Verilog Tutorial(2)数据类型和数组简介

    在自己准备写verilog教程之前,参考了许多资料----FPGA Tutorial网站的这套verilog教程即是其一。这套教程写得不错,只是没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。 这是网站原文:https://fpgatutorial.com/verilog/ 这是系列导航:Verilog教程系列文章导航 在这篇

    2023年04月25日
    浏览(24)
  • Verilog Tutorial(10)如何实现可复用的设计?

    在自己准备写verilog教程之前,参考了许多资料----FPGA Tutorial网站的这套verilog教程即是其一。这套教程写得不错,只是没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。 这是网站原文:https://fpgatutorial.com/verilog/ 这是系列导航:Verilog教程系列文章导航 本文将

    2023年04月09日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包