FPGA基础(数字电路)

本文深入探讨了Verilog语言在数字逻辑设计中的应用,包括数字电路基础、常见逻辑电路设计如编码器、译码器、加法器等,以及触发器、寄存器与时序逻辑电路的设计方法。

Verilog语言是硬件描述语言而不是设计语言。在写Verilog代码时,大脑要先想好完成的具体功能应该用什么样的电路实现,然后再用Verilog描述出来。
1.数字电路和模拟电路
数字信号指信号无论从时间上还是大小上都是不连续的。
模拟信号指时间联系变化的信号
2.数制与编码
在Verilog中表示一个二进制,首先要给出长度,二进制的标识,最后是数值。例如8’b1000,表示8位二进制数1000。如果表示十进制数,将二进制标识换成十进制表示。
位数和标识可以省略,默认位数是32位,默认进制是十进制。
3.逻辑代数
在逻辑代数中有三种基本的逻辑运算,分别是与、或、非。这三种逻辑运算可以组合任意复杂逻辑运算。
根据逻辑功能的不同,可以将数字电路分为两类,组合逻辑电路、时序逻辑电路。
组合逻辑电路:电路的输出仅仅与当时的输入有关系,与之前的输入没有关系。
组合逻辑电路分析方法
常用的逻辑电路有编码器、译码器、数据选择器、数值比较器和加法器。

  1. 编码器
    日常生活中电视机遥控器上的键盘输入和密码锁。编码器有互斥编码器和优先编码器之分。互斥编码器:任意时刻只允许一个输入信号有效,否则将产生错误输出。
    优先编码器:允许多个输入信号同时有效,输出是对优先级别高的输入信号进行编码。
    8-3互斥编码器
    8-3编码器可以3位二进制代码对8个信号进行编码的电路。8个输入3个输出。
    设计8-3编码器
    第一步根据给出的逻辑功能写出真值表,8个互斥的输入信号,编成一个对应的3位二进制代码。将8个输入信号分别定义为I0,I1,I2一直到I7,将3个输出信号定义为A0、A1和A2。每一个互斥的输入信号为1时,输出一个对应的3位二进制码。
    当I0输入为1时,对应的三个输出是111。当I1输入为1时,对应的三个输出为110。以此类推直到I7输入为1,对应输出为000。根据这个公式写出真值表。
    根据真值表,写出逻辑表达式。将输入变量等于1 的情况相或起来,写出表达式。
    通过表达式看出,每个输出变量的结果都由若干个输入变量通过相或之后得到的。根据这些函数式画出逻辑图。
    对互斥编码器修改为优先编码器。允许某一时刻多个输入端为有效电平,但只对优先级最高的输入信号进行编码。在这里规定I7的优先级最高,I0的优先级最低,根据条件,列出真值表。

利用Verilog来描述编码器

module Digital_Encoder(
	I,A
);

input [7:0]  I;
output [2:0]  A;

reg [2:0] A ;
always@(*)
begin
	case(I)
	8'b0000_0001 : A=3'b000;
	8'b0000_0010 : A=3'b001;
	8'b0000_0100 : A=3'b010;
	8'b0000_1000 : A=3'b011;
	8'b0001_0000 : A=3'b100;
	8'b0010_0000 : A=3'b101;
	8'b0100_0000 : A=3'b110;
	8'b1000_0000 : A=3'b111;
	default : A = 3'b000;
	endcase
end

endmodule

开头是module关键字,紧接着是模块名Encoder(英文翻译为中文为编码器)。模块名之后是端口名I,A。编码器有8个输入和3个输出,按照常规的写法,可以分别把输入写为I0、I1、I2一直到I7和三个输出A0、A1、A2,如果有100个输入是不是要写100个?为了解决这种问题,所以写input [7:0] I,每一位代表一个输入。往下是数据类型的定义。在过程赋值语句always中左侧变量声明为reg。如果是连续赋值语句assign,需要用到的就是wire,可以省略声明,系统默认为wire型。接下来是always关键词,always@(*表示代码中的任何东西改变,都会触发里边的程序。begin end之间的代码顺序执行,被module和endmodule括起来的语句并行执行。如果在一个module中有两个always,这两个always没有先后顺序,同时执行。case是一种多分支选择语句,当输入I为8’b00000001,代表I7为0,代表I6为0,代表I5为0,代表I4为0,代表I3为0,代表I2为0,代表I1为0,代表I0为1,此时输出为3’b001,也就是A2为0,A1为0,A0为1。case和endcase成对出现。default关键字的意思:如果上述条件不符合,会执行default中的语句。
观察case里的几条语句,与编码器真值表很像,这段代码描述的就是编码器真值表。接下来是优先编码器。代码基本与上边的代码差不多。唯一不同的是使用了if关键字。如果输入I7等于0,那么便会执行A=3’b000,如果I7不等于0,那么就不会执行。

module Digital_Priority_Encoder
(
	I,A
);
input [7:0] I;
output [2:0] A;
reg [2:0] A;

always@(*)
begin
	if(I[7] == 1'b0)  A = 3'b000;
	else if(I[6] == 1'b0)  A = 3'b001;
	else if(I[5] == 1'b0)  A = 3'b010;
	else if(I
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值