0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在verilog中使用If语句和case语句?

Hack电子 来源:IC设计er 2023-04-18 09:45 次阅读

在这篇文章中,我们讨论了verilog中最常用的两个结构-if语句和case语句。

我们在上一篇文章中已经看到了如何使用程序块(例如 always 块来编写按顺序执行的 verilog 代码。 我们还可以在程序块中使用许多语句来控制在我们的verilog设计中信号赋值的方式。

这些语句统称为顺序语句。case 语句和 if 语句都是 verilog 中顺序语句的示例。在这篇文章的其余部分,我们将讨论如何在verilog中使用这两个语句。

然后,我们考虑这两个结构的简短示例,以说明我们如何在实践中使用它们。

Verilog If 语句

if 语句是一个条件语句,它使用布尔条件来确定要执行哪些verilog代码块。只要条件的计算结果为 true,就会执行与该条件关联的代码分支。此语句类似于其他编程语言(如 C)中使用的 if 语句。

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

1 if()begin
2 // Code to execute
3 end
4 elseif()begin
5 // Code to execute
6 end
7 elsebegin
8 // Code to execute
9 end

如果我们不需要 else 和 else 分支,我们可以从语句中删除它们。事实上,我们已经在关于always块的帖子中看到了这一点,我们在其中使用 posedge 宏来检测时钟信号的上升沿。如果需要,我们可以包含尽可能多的其他分支,以正确建模底层电路。

if 语句使用布尔条件来确定要执行的代码行

在上面的代码段中,这些表达式由 给出。这些表达式按顺序计算,如果表达式的计算结果为 true,则执行与表达式关联的代码。 if 语句只有一个分支将执行。这通常是计算结果为 true 的第一个表达式。唯一的例外情况是,当所有表达式都不为 true 时。在这种情况下,将执行 else 分支中的代码。当我们在 if 语句代码中省略 else 分支时,在这种情况下不会执行任何分支。

与每个分支关联的代码可以包含任何有效的 verilog 代码,包括进一步的 if 语句。此方法称为嵌套 if 语句。 在 verilog 中使用这种类型的代码时,我们应该注意限制嵌套语句的数量,因为它可能会导致满足时间的困难。

If 语句示例

我们已经看到了 if 语句的实际示例,当在 verilog always块的帖子中对触发器进行建模时。为了更彻底地演示此结构,让我们考虑一个时钟多路复用器的示例。

在本例中,我们将使用异步复位的 D 类型触发器来保存多路复用器的输出。下面的电路图显示了我们将在本例中使用的电路。

31358a3e-dd86-11ed-bfe3-dac502259ad0.png

下面的代码片段显示了我们如何使用单个 always 块和 if 语句来实现这一点。

1 always@(posedgeclock,posedgereset)begin
2 if(reset)begin
3 Q <= 1'b0;
4 end
5 elsebegin
6 if(addr)begin
7 Q <= b;
8 end
9 elsebegin
10 Q <= a;
11 end
12 end
13 end

在此示例中,我们使用第一个if语句在复位时触发,输出0。当复位无效时,always块已由时钟的上升沿触发。我们使用第一个 if 语句的 else 分支来被触发,我们使用第二个if语句来模拟多路复用电路的行为。这是 verilog 中嵌套 if 语句的示例。

当 addr 信号为 0b时,我们使用嵌套 if 语句的第一个分支被触发,将输入a赋值给输出。然后,我们使用嵌套 if 语句的 else 分支来捕获 addr信号为1b 时的情况。 我们也可以在这里使用 else-if 类型语句,但 else 语句更简洁。这两种情况下的行为是相同的,因为信号在实际电路中只能是0b或1b。

Verilog case语句

我们使用 verilog case 语句根据设计中给定信号的值选择要执行的代码块。当我们在verilog中编写语句时,我们指定了一个要监视和评估的输入信号。然后将该信号的值与case语句的每个分支中指定的值进行比较。找到输入信号值的匹配项后,将执行与该值关联的分支。 verilog case语句执行的功能 C语言中的switch语句相同。下面的代码片段显示了 verilog 中case语句的一般语法。

1 case()
2 :begin
3 // This branch executes when =
4 end
5 :begin
6 // This branch executes when =
7 end
8 default:begin
9 // This branch executes in all other cases
10 end
11 endcase

可以删除语句的默认分支,尽管这是不可取的。如果删除默认分支,则<变量>的所有有效值都必须具有自己的分支。与 if 语句一样,与每个分支关联的代码可以包含任何有效的 verilog 代码。这包括进一步嵌套顺序语句,例如if或case语句。同样,我们应该尝试限制嵌套语句的数量,因为它可以更轻松地满足我们的计时要求。

case语句示例 为了更好地演示erilog中使用case语句的使用方式,让我们考虑一个基本示例。在本例中,我们将介绍一个简单的四比一多路复用电路。 我们经常使用 case 语句在 verilog 中对大型多路复用器进行建模,因为它生成的代码比基于连续赋值的实现更具可读性。下面的电路图显示了我们将在本例中使用的电路。

下面的代码片段显示了我们将如何使用 case 语句实现此电路。

31493f20-dd86-11ed-bfe3-dac502259ad0.png

1 always@(*)begin
2 case(addr)
3 2'b00:begin
4 q = a;
5 end
6 2'b01:begin
7 q = b;
8 end
9 2'b10:begin
10 q = c;
11 end
12 default:begin
13 q = d;
14 end
15 endcase
16 end

此示例显示了使用 verilog中的case语句对多路复用器进行建模是多么简单。事实上,case语句提供了在 verilog 中对多路复用器进行建模的最直观方法。 虽然这个例子很简单,但有几个要点我们应该更详细地考虑。在这个例子中首先要注意的是,我们使用阻塞赋值。这样做的原因是我们正在对组合逻辑进行建模,而非阻塞分配通常会导致在我们的设计中放置触发器。

这里要注意的另一件事是,我们可以从此示例中删除默认关键字。然后,我们将显式列出输出d 值所需的 addr 值。但是,我们在此示例中包含了默认关键字,以演示应如何使用它。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1327

    浏览量

    109302
  • 编程语言
    +关注

    关注

    9

    文章

    1878

    浏览量

    33145
  • 触发器
    +关注

    关注

    14

    文章

    1681

    浏览量

    60406
  • 时钟信号
    +关注

    关注

    4

    文章

    374

    浏览量

    28063

原文标题:Verilog中的If语句和case语句

文章出处:【微信号:Hack电子,微信公众号:Hack电子】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    何在bash中使用条件语句

    今天我们介绍一下如何在 bash 中使用条件语句
    的头像 发表于 12-09 17:27 1857次阅读
    如<b class='flag-5'>何在</b>bash<b class='flag-5'>中使</b>用条件<b class='flag-5'>语句</b>

    新手求解verilog 中的生成块语句 的意思

    verilog 中的 generate for 语句好理解,但是 generate if 和 generate case 语句怎么理解??
    发表于 12-21 12:44

    verilog中generate语句的用法分享

    generate为verilog中的生成语句,当对矢量中的多个位进行重复操作时,或者当进行多个模块的实例引用的重复操作时,或者根据参数的定义来确定程序中是否应该包含某段Verilog代码的时候
    发表于 12-23 16:59

    开关语句和循环语句

    switch/case开关语句是一种多分支选择语句,是用来实现多方向条件分支的语句。虽然从理论上讲采用条件语句也可以实现多方向条件分支,但是
    发表于 07-15 14:26 18次下载

    verilog中if与case语句不完整产生锁存器的原因分析

      在很多地方都能看到,verilog中if与case语句必须完整,即if要加上else,case后要加上default语句,以防止锁存器的
    发表于 09-16 09:29 24次下载

    Verilog可综合的循环语句

    Verilog中提供了四种循环语句,可用于控制语句的执行次数,分别为:for,while,repeat,forever。其中,for,while,repeat是可综合的,但循环的次数需要在编译之前就确定,动态改变循环次数的
    发表于 10-13 12:23 1.8w次阅读

    verilog中的initial语句说明

    解释verilog HDL中的initial语句的用法。
    发表于 05-31 09:11 0次下载

    Verilog的两种块语句解析

    1. 块语句有两种,一种是 begin-end 语句, 通常用来标志()执行的语句;一种是 fork-join 语句,通常用来标志()执行的语句
    的头像 发表于 06-18 15:16 2804次阅读

    简述Verilog HDL中阻塞语句和非阻塞语句的区别

      在Verilog中有两种类型的赋值语句:阻塞赋值语句(“=”)和非阻塞赋值语句(“=”)。正确地使用这两种赋值语句对于
    的头像 发表于 12-02 18:24 5137次阅读
    简述<b class='flag-5'>Verilog</b> HDL中阻塞<b class='flag-5'>语句</b>和非阻塞<b class='flag-5'>语句</b>的区别

    Verilog的块语句

    begin_end顺序块,用于将多条语句组成顺序块,语句按顺序一条一条执行(除了带有内嵌延迟控制的非阻塞赋值语句),每条语句的延迟时间是相对于由上一条
    的头像 发表于 05-18 10:29 1139次阅读

    什么是SystemVerilog-决策语句-if-else语句

    决策语句(Decision statements)允许程序块的执行流程根据设计中信号的当前值分支到特定语句。SystemVerilog有两个主要的决策语句:if…else语句
    的头像 发表于 02-09 14:15 677次阅读
    什么是SystemVerilog-决策<b class='flag-5'>语句</b>-if-else<b class='flag-5'>语句</b>?

    Verilog中的If语句case语句介绍

    。这些语句统称为顺序语句case 语句和 if 语句都是 verilog 中顺序
    的头像 发表于 05-11 15:37 3138次阅读
    <b class='flag-5'>Verilog</b>中的If<b class='flag-5'>语句</b>和<b class='flag-5'>case</b><b class='flag-5'>语句</b>介绍

    Verilog常用的循环语句及用途

    本文主要介绍verilog常用的循环语句,循环语句的用途,主要是可以多次执行相同的代码或逻辑。
    的头像 发表于 05-12 18:26 1247次阅读

    case后边可以跟多个语句

    是的,"case" 后面可以跟多个语句。在编程语言中,"case" 通常被用于 switch 语句中,用于检查一个变量或表达式是否匹配某个特定的值。当匹配成功时,可以执行一个或多个
    的头像 发表于 11-30 14:19 2509次阅读

    java中的switch语句 case的取值

    Java中的switch语句是一种用于多重条件判断的语句,用于根据不同的条件执行不同的代码块。在switch语句中,case关键字用来指定不同的取值。 在Java中,switch
    的头像 发表于 11-30 16:05 334次阅读