数字电路的基础知识(结合Verilog)

 

1.数制与编码

1.1格雷码

1.2二进制码和格雷码的相互转换

1.2.1二进制码转换为格雷码

1.2.2格雷码转换为二进制码

2.逻辑代数

3.硬件描述语言(Verilog)

关于reg和wire的使用以及alway @(A,B):

 

 


 

本文结合了原锆石科技文档资料(截取其中部分图表),并参考了康华光《 电子技术基础 数字部分》(第六版)。

 

1.数制与编码

在verilog中想要表示一个二进制,首先要给出二进制的长度,其次要给出二位数的标识(例如:8'b1000,表示8位的二进制数1000;8'd8,表示十进制10;8'h8,表示十六进制8)

注意:位数与标识可以省略,默认的位数是32位,默认的进制是十进制

                                                                             表1.1 常见编码

1.1格雷码

格雷码又叫循环二进制码反射二进制码,它的基本特点是任意两个相邻的代码只有一位二进制数不同。这里着重强调格雷码的原因是,当数字变化的位数越多,每个位变化的频率也比较高,在某些特定情况下是十分不利的,可能会导致电路状态错误或输出错误的结果。而使用格雷码可以有效避免这种错误,由于格雷码具有循环特性和单步特性,当用它表示一个连续变化的数值时,仅有一个位会翻转,大大降低了位变化的频率,因此可以保证传输的稳定性和较低的传输误码率

下图是十进制0-15对应的格雷码:

1.2二进制码和格雷码的相互转换

1.2.1二进制码转换为格雷码

最左边一位保持不变,从右边倒数第一位起,依次与左边一位进行异或操作,作为该位对应格雷码的值。

1.2.2格雷码转换为二进制码

最左边一位保持不变,从左边第二位起,依次与左边一位进行异或操作,作为该位对应二进制码的值。

 

2.逻辑代数

Verilog HDL内置26个基本元件,其中14个是门级元件,12个为开关级元件,其中7个基本门分别为:and(与)、nand(与非)、or(或)、nor(或非)、not(非)、xor(异或)、nxor(同或)。

                                                           表2.1 常见的门电路的几种表示方法

3.硬件描述语言(Verilog)

模块是Verilog HDL的基本描述单位,用于描述每个设计的功能或结构,以及与其他模块通信的外部接口。一个模块可以包括整个设计模块或者设计模型的一部分,模块的定义总是从关键词module开始,以关键词endmodule结尾。

                                                                  图3.1 一般的Verilog语法结构

这里简要对描述接口说明部分进行详细阐述(引用低层次模块和基本门级元件、连续赋值语句(assign)、过程赋值语句(initial和always)以实例给出)。

(1)"模块名"是模块唯一的标示符,括号中以逗号分隔列出的端口名是该模块的输入、输出端口;

(2)"端口类型说明"为input(输入)、output(输出)、inout(双向端口)三种类型,凡是在模块后面圆括号中出现的端口必须明确定义其端口类型;

(3)"参数定义"是将常量用符号常量替代,以增加程序的可读性和可修改性,是一个可选择的语句,用不到可以省略;

(4)"数据类型定义"部分用来指定模块内所用的数据对象是寄存器类型(reg等)还是连线类型(wire等)。

 

下面以与门的Verilog代码为例。

                                                图3.2 使用连续赋值语句描述方法实现与门电路

注意:

(1)这里未对数据类型进行定义,是因为input或output默认的数据类型是wire型,因此在此省略(也可以对其进行定义,wire A,wire B,wire Y);

(2)连续赋值语句assign是针对wire型变量的一种赋值语句,wire型变量一般对应到FPGA中的一根线,由于wire型的值是会随着驱动源的变化而变化的,因此也将assign成为"连续"赋值语句;

(3)Verilog中没有与非、或非、异或和同或这些组合逻辑运算符号,但是可以通过组合与、或和非运算得到。

 

                                                       图3.3 引用低层次模块的描述方法实现与门电路

 

                                                        图3.4 利用过程赋值语句来描述与门电路

关于reg和wire的使用以及alway @(A,B):

(1)在Verilog中,任何过程赋值的左侧变量必须声明为reg,除此之外使用的变量必须声明为wire

(2)Verilog区分reg和wire的原因与数据类型检查有关,这样能保证设计者无法对同一变量使用两种不同类型赋值。如果尝试对同一个变量既做连续赋值,又做过程赋值,连续赋值要求用net声明,过程赋值要求用reg赋值,而把同一个变量同时声明为两种类型属于语法错误net并不是一个关键字,它代表了一组数据类型,包括wire、wand、wor、tri、triand、trior以及trireg等。线网(net)表示硬件单元之间的连接,就像在真实的电路中一样,线网由其连接器件的输出端连续驱动。线网一般使用关键字wire进行声明,如果没有显式地说明为向量,则默认线网的位宽为1);

(3)always @(A,B),@是事件等待语句,意思是always不断循环等待A和B两个敏感变量变化,不管A和B是从高到低,还是从低到高,将会执行always下面的 Y=A&&B语句。如果A和B都没有变化,那么always将不往下执行,将一直循环等待。新标准可以书写为always @ (*),是个组合逻辑电脑的描述方式,能够防止在设计时因考虑不周全导致的一些操作失误,敏感表用*(表示全部的敏感变量),只要有任何输入信号变化,其输出立即发生变化

References:

锆石科技《HELLO FPGA数字部分》

  • 9
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值