当前位置:首页 > 新闻资讯 > FPGA之家动态 >

FPGA入门系列6--判断语句

时间:2024-07-26      来源:网络搜集 关于我们 0

文章

简介

本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解,旨在更快速的提升初学者在FPGA开发方面的能力,每一个章节中都有针对性的代码书写以及代码的讲解,可作为读者参考。

第七章:判断语句

        同一个变量可以在不同的情况下获得不同的值,不同的情况需要判断语句来描述。Verilog HDL 中经常使用的判断语句有 if else 语句和 case endcase 语句,两 种判断语句必须写在 always 或者 initial 语句中,不能写在 assign 中。

        if else 语句是一条语句,if 和 else 后面又可以分别带不同语句。if 后面需要有 小括号,小括号内写明 if 的条件,若 if 的条件满足,则执行 if 后面的语句,不然则执行 else 的语句,示例如下所示。

代码示例 1:

代码解析 1:

①第 1 行描述了一个 always 块,always 内的语句根据 clk 的上升沿作为触发条件;

 ②第 2 行描述了 if 的条件为 a==1;

 ③第 3 行为 if (a==1)的语句; 

 ④第 4 行为 else,表明除去 a==1 的条件,即 a!=1 的情况下 else 满足; 

 ⑤第 5 行为 else 条件成立的结果语句。

        if else 后面可以继续叠加 if else,如下所示。

代码示例 2:

代码解析 2:

        ①第 1、2、3 行同第一个代码示例一样;

        ②第 4 行此处在 else 后面再次加入了 if 条件,这条语句表明在除去 a==1 的 情况下并且 a==2 时,b=2; 

       ③后面的语句同第 4、5 行类似。最后没有else,表明当满足所有列出的条件以外的条件时,b 的值保持最后被赋值时刻的值,例如 a==3 时,b=3,a 变成 9 时,b 的值保持不变,仍然为 3。 

        ④if else 叠加不易过多,不然可能造成线路的延时过多。如图 1 所示,每一 个 if else 语句都会生成一个选择器,当 if else 过多时,选择器链路就会很长,而每两级选择器之间都会有线路的延时,当链路过多时,造成的延时就会很多,这样对于描述的电路的时序影响会很大,时序出问题时,就算是功能仿真正确,下板后电路也是不正确的。

图 1 if else 延时

代码示例 3:

代码解析 3:

        ①第 1 行同代码示例 1 一致; 

        ②第 2、3 行此处判断当 a 大于 1 时,b 被赋值为 1; 

        ③第 4、5 行判断当 a 等于 2 时,b 被赋值为 2。    

        我们会发现按照这样处理, b 的值会一直等于 1,原因就是因为第一个判断条件为 a 大于 1,包含了 a 等于 2,if else 的特点是会从上往下判断对应的条件,当上面的条件满足时,不会再继续判断下面的条件,因此为了更好地描述我们的电路,我们使用 if else 时需要考虑清楚优先级,优先执行的,把条件放到上面,后面执行的,把条件放到下面。

        在组合逻辑中,if else 的最后一级尽量以 else 结尾,避免生成锁存器,时序逻辑中无需考虑。 

        在 if else 级数过多的情况下,可以选择 case 语句,case 语句可以生成多路选择器,结构图如下图 2 所示。

图 2 多路选择器结构图

        在 Verilog HDL 中,case 语句必须写在 always 或 initial 块中,不能写入到 assign 中,case 语句必须以 endcase 结束,具体代码示例如下所示。 

代码示例 4:

代码解析 4: 

①第 1 行描述了一个 always 块,该 always 块以 clk 的上升沿作为触发条件; 

②第 2 行描述了一个 case 语句,该 case 语句的条件为 a; 

③第 3、4、5 行表述了在 a 的不同状态下,b 将会被赋予不同的值; 

④第 6 行描述了除去列举出来的状态,当 a 处于其他状态时,b 被赋予 0 值。在使用组合逻辑,并且没有列出所有 a 的状态时,若此处不使用 default,则可能被综合成锁存器,因此尽量在没有列出所有状态的情况下,后面加上 default 语 句; 

⑤第 7 行以 endcase 结束 case 语句。

练习:

        输入:时钟 clk;复位 rst_n,低电平有效;输出:计数器 po_cnt。 

        功能:在 clk 上升沿驱动的情况,当 rst_n 有效时,po_cnt 输出 0, 不然输出 po_cnt 每个 clk 的上升沿加 1,当加到最大值 15,po_cnt 归 0,并继 续计数。具体代码如下所示。

代码解析: 

        ①第 4 行定义输出变量 po_cnt,po_cnt 所能表达的最大值为 15,所以 po_cnt 最小的位宽需要定义为 4 位宽; 

        ②第 8 行的 always 块根据描述具体功能要求。

在第八章中将对Verilog HDL 中的时钟分频进行讲解。

FPGA入门系列1--模块书写&电路综合

FPGA入门系列2--仿真验证

FPGA入门系列3--wire与reg

FPGA入门系列4--赋值语句

FPGA入门系列5--运算符号

未完待续

 关注我们了解更多资讯


注明:本内容来源网络,不用于商业使用,禁止转载,如有侵权,请来信到邮箱:429562386ⓐqq.com 或联系本站客服处理,感谢配合!

用户登陆

    未注册用户登录后会自动为您创建账号

提交留言