时间: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 中的时钟分频进行讲解。
未完待续
关注我们了解更多资讯