本文通过研究如何使用条件运算符来描述组合真值表,介绍了在 Verilog 中描述组合电路的技术。它还展示了如何利用 Verilog 的“always”块来描述组合电路——“always”块可以为我们提供更简单的解决方案来描述数字电路。
在之前的文章中,我们讨论了使用 Verilog “assign” 关键字来执行连续赋值。此类分配始终处于活动状态,可用于获取数字电路的门级描述。例如,在以下描述 AND 门的代码中,不断评估右侧并将结果放在 out1 网络上:
assign out1 = a & b;
Verilog 有一个条件运算符 (?:),它允许我们在进行此类分配之前检查条件。语法如下:
assign [signal_name] = [conditional_expression] ? [value_if_true] : [value_if_false];
评估“conditional_expression”。如果为真,则将“value_if_true”分配给“signal_name”。如果不是真的,“signal_name”得到“value_if_false”。例如,考虑以下代码:
assign out1 = (sel) ? (a & b) : (a|b);
如果“sel”为真,a&b 将被分配给“out1”。如果不正确,“out1”将得到 a|b。因此,上述代码实现了 2 对 1 多路复用器的功能。此代码的概念实现可以如下图 1 所示。
条件赋值允许我们对某些电路进行更抽象的描述,因为它具有传统计算机编程语言中的“if”语句的功能。条件运算符可以嵌套形式用于实现更复杂的电路。示例 1 讨论了这些细节。
使用条件运算符 (?:) 描述具有以下真值表的 4 到 2 优先级编码器:
此优先级编码器的 Verilog 代码如下所示:
module Prio_4_to_2
(
input wire [3:0] x,
output wire [1:0] y,
output wire v
);
assign y = x[3] ? 2'b11 :
x[2] ? 2'b10 :
x[1] ? 2'b01 :
2'b00;
assign v = ( x[3] | x[2] | x[1] | x[0] ) ? 1'b1 : 1'b0;
endmodule
除了第 7 行到第 10 行之外,代码还包含我们上一篇文章中讨论的基本语言元素。那么让我们来看看这些行。
术语 2'b11、2'b10、2'b01 指的是表示两位二进制数的 Verilog 符号。通常,第一个数字('b 之前)指定位数。字母 b 指定数字是二进制的。'b 之后的数字给出了数字的值。因此,2'b01 是 Verilog 表示法,表示值为 01 的两位二进制数,而 3'b100 表示值为 100 的三位二进制数。
第 7 行在条件运算符中检查输入 x[3] 的 MSB。如果 x[3]=1,则将条件评估为真,并将 2'b11 分配给 y(分配的值取自真值表)。如果 x[3]=0,则条件被评估为 false,冒号 (:) 之后的表达式将分配给 y。冒号后面的表达式是第 8 行中的代码,它本身就是另一个条件运算符。
第 8 行中的第二个条件运算符检查输入的第二个最高有效位 x[2],以确定是否应该将 2'b10 分配给 y 或冒号后面的表达式,这又是另一个条件运算符(第 9 行)应该被评估。您可以验证分配给 y 的值是否与给定的真值表匹配。
如果输入的至少一位为逻辑高,则真值表的有效输出 (v) 将为逻辑高。第 11 行通过将按位或运算符 (|) 应用于输入的位来显示此描述。上述代码的赛灵思 ISE 仿真如图 2 所示。
重要的是要注意条件表达式是连续计算的,直到找到一个真正的表达式。将执行对应于这个真表达式的赋值。因此,与下一个相比,较早评估的表达式具有更高的优先级。这意味着,从理论上讲,条件运算符更适合实现优先级网络(图 3),而不是多路复用器等平衡结构(图 4)。
前一篇文章揭示了关于 VHDL 并发分配的类似讨论。
我们可以将任何组合电路分解成几个基本的逻辑门(AND、OR、NOT 等),并使用“assign”语句来描述这些门(门级描述)。我们还可以使用上一节中讨论的条件运算符来以更抽象的方式描述一些组合电路(类似于计算机编程语言的“if”语句)。然而,还有一个更强大的解决方案:使用 Verilog “always” 块。
在“always”块中,我们可以有顺序执行的过程语句。此外,“always”块支持抽象语言结构,例如“if”和“case”语句。
由于人类推理具有顺序性并依赖于抽象描述,因此顺序执行功能以及“始终”块中可用的抽象语言结构使我们能够更轻松地描述电路的功能。我们通常以算法的高级方式而不是低级逻辑门来思考。“always”块可以为我们提供更简单的解决方案来描述数字电路。有关 HDL 为什么支持基于顺序语句的描述的更多详细信息,请参阅我的文章Introduction to Sequential VHDL Statements。
“always”块的简化语法如下所示:
always @(sensitivity_list)
begin
sequential_statements;
end
敏感度列表指定何时应该执行“always”块内的顺序语句。例如,考虑使用“always”块来描述图 5 中的电路。
当 a 或 b 改变时,输出可能会改变,这意味着 a 和 b 都应该在“always”块的敏感度列表中。一般来说,对于组合电路,所有输入信号都应包含在灵敏度列表中。
现在,我们可以使用按位与运算符来描述电路 (a&b) 的功能并将结果分配给输出。在“always”块中,有两种不同类型的赋值:阻塞赋值(=)和非阻塞赋值(<=)。使用阻塞赋值,我们得到以下代码:
always @(a, b)
begin
out1 = a & b;
end
阻塞赋值和非阻塞赋值有什么区别?
使用阻塞分配,评估右侧并立即分配给 out1。因此,当执行第 3 行时,out1 会在我们转到下一行代码之前立即更新。名称“阻塞赋值”强调即将到来的行被阻塞,直到左侧得到更新。
对于非阻塞赋值,右边的表达式被求值,但它不会应用于左边的变量,直到我们到达“always”块的末尾。阻塞或非阻塞分配的选择可能会让初学者感到困惑,并且不正确地使用它们可能会导致不想要的功能。例如,使用阻塞赋值来推断触发器可能会引入竞争条件。
对于这篇介绍性文章,我们不会进一步详细介绍,我们将只遵循一个简单的准则来避免潜在的陷阱:在编写组合电路的代码时使用阻塞赋值。因此,清单 1 中的“always”块将用于描述与门。
在之前的文章中,我们熟悉了Verilog “wire”数据类型。这种数据类型代表我们 FPGA 设计中的物理线路。在“always”块中,Verilog 标准不允许我们为“wire”分配值。相反,我们使用“reg”数据类型。“reg”这个名称有点令人困惑,但请注意,“reg”可能会或可能不会导致您的设计中的物理存储元素。以下代码是使用“always”块的图 5 的 Verilog 描述。请注意,输出数据类型应为“reg”,因为它的值来自过程赋值。
module Circuit_1
(
input wire a,
input wire b,
output reg out1
);
always @ (a, b)
begin
out1 = a & b;
end
endmodule
在本文中,我们熟悉了 Verilog 条件运算符。我们使用此运算符的嵌套形式来描述优先级编码器。然后,我们谈到了一个更强大的语言结构,“always”块,来描述组合电路。
今天小编带来了:ISSCC2022套餐,里面有文章、PPT、Tutorial等,同学可以拿回去自己学习研究。
1、深入理解SerDes(Serializer-Deserializer)之一
2、深入理解SerDes(Serializer-Deserializer)之二
3、科普:深入理解SerDes(Serializer-Deserializer)之三
4、资深工程师的ESD设计经验分享
5、干货分享,ESD防护方法及设计要点!
6、科普来了,一篇看懂ESD(静电保护)原理和设计!
7、锁相环(PLL)基本原理 及常见构建模块
8、当锁相环无法锁定时,该怎么处理的呢?
9、高性能FPGA中的高速SERDES接口
10、什么是毫米波技术?它与其他低频技术相比有何特点?
11、如何根据数据表规格算出锁相环(PLL)中的相位噪声
12、了解模数转换器(ADC):解密分辨率和采样率
13、究竟什么是锁相环(PLL)
14、如何模拟一个锁相环
15、了解锁相环(PLL)瞬态响应
16、如何优化锁相环(PLL)的瞬态响应
17、如何设计和仿真一个优化的锁相环
18、锁相环(PLL) 倍频:瞬态响应和频率合成
19、了解SAR ADC
20、了解 Delta-Sigma ADC
21、什么是数字 IC 设计?
22、什么是模拟 IC 设计?
23、什么是射频集成电路设计?
24、学习射频设计:选择合适的射频收发器 IC
25、连续时间 Sigma-Delta ADC:“无混叠”ADC
26、了解电压基准 IC 的噪声性能
27、数字还是模拟?I和Q的合并和分离应该怎么做?
28、良好通信链路性能的要求:IQ 调制和解调
29、如何为系统仿真建模数据转换器?
30、干货!CMOS射频集成电路设计经典讲义(Prof. Thomas Lee)
31、使用有效位数 (ENOB) 对 ADC 进行建模
32、以太网供电 (PoE) 的保护建议
33、保护高速接口的设计技巧
34、保护低速接口和电源电路设计技巧
35、使用互调多项式和有效位数对 ADC 进行建模
36、向 ADC 模型和 DAC 建模添加低通滤波器
37、揭秘芯片的内部设计原理和结构
38、Delta-Sigma ADCs中的噪声简介(一)
39、Delta-Sigma ADCs中的噪声简介(二)
40、Delta-Sigma ADCs 中的噪声简介(三)
41、了解Delta-Sigma ADCs 中的有效噪声带宽(一)
42、了解Delta-Sigma ADCs 中的有效噪声带宽(二)
43、放大器噪声对 Delta-Sigma ADCs 的影响(一)
44、放大器噪声对 Delta-Sigma ADCs 的影响(二)
45、参考电压噪声如何影响 Delta Sigma ADCs
46、如何在高分辨率Delta-Sigma ADCs电路中降低参考噪声
47、时钟信号如何影响精密ADC
48、了解电源噪声如何影响 Delta-Sigma ADCs
49、运算放大器简介和特性
50、使用 Delta-Sigma ADCs 降低电源噪声的影响
51、如何设计带有运算放大器的精密电流泵
52、锁定放大器的基本原理
53、了解锁定放大器的类型和相关的噪声源
54、用于降低差分 ADC 驱动器谐波失真的 PCB 布局技术
55、干货!《实用的RFIC技术》课程讲义
56、如何在您的下一个 PCB 设计中消除反射噪声
57、硅谷“八叛徒”与仙童半导体(Fairchild)的故事!
1、免费公开课:ISCAS 2015 :The Future of Radios_ Behzad Razavi
2、免费公开课:从 5 微米到 5 纳米的模拟 CMOS(Willy Sansen)
3、免费公开课:变革性射频毫米波电路(Harish Krishnaswamy)
4、免费公开课:ESSCIRC2019-讲座-Low-Power SAR ADCs
5、免费公开课:ESSCIRC2019-讲座-超低功耗接收器(Ultra-Low-Power Receivers)
6、免费公开课:CICC2019-基于 ADC 的有线收发器(Yohan Frans Xilinx)
7、免费公开课:ESSCIRC 2019-有线与数据转换器应用中的抖动
8、免费公开课:ISSCC2021 -锁相环简介-Behzad Razavi
9、免费公开课:ISSCC2020-DC-DC 转换器的模拟构建块
10、免费公开课:ISSCC2020-小数N分频数字锁相环设计
11、免费公开课:ISSCC2020-无线收发器电路和架构的基础知识(从 2G 到 5G)
12、免费公开课:ISSCC2020-从原理到应用的集成变压器基础
13、免费公开课:ISSCC2021-射频和毫米波功率放大器设计的基础
摩尔学堂(www.moorext.com)--摩尔学堂专注于半导体人才培训,在线学习服务平台!