时序电路VHDL讲解
第四讲VHDL语言基础知识
关键词 VHDL 实体 逻辑功能
此两处必须同名
逻辑行为描述
1、实体
格式
ENTITY 实体名 IS [GENERIC ( 类属表 );] [PORT ( 端口表 );] END 实体名;
说明
实体说明所设计的逻辑电路的输入、输 出信号及其特性(输入(in)输出(out)、双向 (inout)、buffer)
•文件(FILES)是传输大量数据的客体,包含一些专门数据 类型的数值。
对象说明的一般格式是: <对象类型> < 标识符表>:<子类型说明> <信号种类>: =<表达式>; 说明 标识符 <子类型说明>是类型名或类型名加限制条件 <信号种类>为BUS或REGISTER,该项为任选项 :=<表达式>为对象赋初值
IS
一个包集合由包集合标题和包集合体两 大部分组成。 包集合体是一个可选项。
5、库
格式
LIBRARY 库名; USE 库名. 程序包名. All;
USE语句的使用有两种常用格式: USE 库名.程序包名.项目名 ; USE 库名.程序包名.ALL ;
VHDL库的种类
• IEEE库:IEEE标准库, 是按IEEE组织制定的 工业标准进行编写的, 是内容丰富的资源库 使用需声明 • •STD_LOGIC_1164 程序包 •STD_LOGIC_ARITH 程序包 •STD_LOGIC_UNSIGNED 程序包
STD库:VHDL标准库,STANDARD和 TEXTIO程序包即收入在STD库中 使用无需声明
VHDL库的种类
• • •
ASIC库:EDA厂商提供库 使用需声明 WORK库:现行作业库,当前工作目录的所有设计 使用无需声明 USER库:用户自定义库 使用需声明
实验三-VHDL时序逻辑电路设计
实验三 VHDL 时序逻辑电路设计一、实验目的1.熟悉用VHDL语言设计时序逻辑电路的方法2.熟悉用Quartus文本输入法进行电路设计二、实验所用仪器元件及用途1.计算机:装有Quartus软件,为VHDL语言提供操作场所。
2.直流稳压电源:通过USB接口实现,为实验开发板提供稳定电源。
3.数字系统与逻辑设计实验开发板:使试验结果下载到开发板上,实现整个实验的最终结果。
三、实验内容1.用VHDL语言设计实现一个8421码十进制计数器。
(1)实验内容及要求:在Quartus平台上设计程序和仿真题目要求,并下载到实验板上验证试验结果。
(2)试验结果:VHDL代码和仿真结果。
2.用VHDL语言设计实现一个分频系数为8,分频输出信号占空比为50%的分频器。
(1)实验内容及要求:在Quartus平台上设计程序和仿真题目要求。
(2)试验结果:VHDL代码和仿真结果。
3.用VHDL语言设计实现一个控制8个发光二极管亮灭的电路。
(1)实验内容及要求:在Quartus平台上设计程序和仿真题目要求,并下载到实验板上验证试验结果。
a.单点移动模式:一个点在8个发光二极管上来回的亮b.幕布式:从中间两个点,同时向两边依次点亮直至全亮,然后再向中间点灭,依次往复c.通过拨码开关或按键控制两种模式的转换(2)试验结果:VHDL代码和仿真结果。
四、实验设计思路及过程1.8421码十进制计数器状态转移表左图为8421码十进制计数器的状态转移表,abcd为初状态,ABCD为下一状态,每当有“1”出现时,相应的管脚就亮灯,从而从0000到1001的灯依次出现。
VHDL代码如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY count12 ISPORT(clk,clear:IN STD_LOGIC;q :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END count12;ARCHITECTURE a OF count12 ISSIGNAL q_temp:ATD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(clk)BEGINIF(clk'event and clk='1') THENIF clear='0' THENq_temp<="0000";ELSIF q_temp="1011"THENq_temp<="0000";ELSEq_temp<=q_temp+1;END IF;END IF;END PROCESS;q<=q_temp;END a;2.分频系数为8,输出占空比为50%的分频器的设计左图为八分频器(占空比50%)的状态转移图,其中abc为原状态,ABC为下一状态。
vhdl语言
VHDL语言VHDL(VHSIC Hardware Description Language)是用于描述数字电路和系统的硬件描述语言,是一种标准化的硬件描述语言,广泛应用于数字电路设计和电子系统设计领域。
VHDL语言是一种强大的工具,可以帮助工程师描述复杂的数字电路,并进行仿真和综合。
它可以描述电路的结构、功能和时序行为,是一种形式化的语言,能够准确地描述电路的行为特性,有助于工程师在设计阶段发现和解决问题。
VHDL语言的基本概念实体(Entity)•实体描述了电路的接口和功能,可以看作是一种抽象的模块。
•实体中定义了输入输出端口,以及对应的信号类型和位宽。
•实体可以包含多个体系结构(Architecture)。
体系结构(Architecture)•体系结构描述了实体的具体实现,定义了实体的行为。
•体系结构中包含了处理逻辑、时序行为以及信号的赋值。
•体系结构可以描述电路的功能和行为。
信号(Signal)•信号是VHDL语言中的基本数据类型,用于在电路中传递信息。
•信号可以是标量(Scalar)或矢量(Vector),可以是时序或组合。
•信号的赋值可以是同步的或异步的。
过程(Process)•过程描述了VHDL中的行为,通常用于描述组合逻辑或时序逻辑。
•过程中可以包含逻辑运算、条件语句、循环语句等。
•过程中的代码在仿真或综合时会被执行。
VHDL语言的应用VHDL语言主要用于数字电路设计、电子系统设计、FPGA设计等领域。
工程师可以使用VHDL语言描述数字电路的结构和行为,进行仿真和综合,快速验证设计的正确性。
VHDL语言的应用领域包括但不限于:•数字电路设计•通信系统设计•控制系统设计•图像处理系统设计•嵌入式系统设计VHDL语言在电子设计领域具有广泛的应用前景,可以帮助工程师快速高效地设计数字电路系统,并满足不同应用场景的需求。
总结VHDL语言是一种强大的硬件描述语言,可以帮助工程师描述数字电路的结构和行为,进行仿真和综合,快速验证设计的正确性。
第11章++硬件描述语言VHDL简介
实体部分最核心的内容是由关键字port引导的端口说明。A和B是输入引脚,使 用了关键字in来描述。Bit的意思是指A和B的数据类型是位类型。位类型数据只可取 0和1这两个数值。S和CO是输出信号,用out来描述,数据类型也是bit型。 实体说明的是部件的名称和端口信号类型,它可以描述小至一个门,大到一个复杂 的CPU芯片、一块印制电路板甚至整个系统。实体的电路意义相当于器件,在电路 原理图上相当于元件符号,它是一个完整的、独立的语言模块,并给出了设计模块 和外部接口。 具体语法如下: entity 实体名 is ——实体名自选,通常用反映模块功能特征的名称 port(端口名称1:端口方式1 端口类型1; 端口名称2:端口方式2 端口类型2;…); end 实体名; ——这里的实体名要和开始的实体名一致 其中端口方式可以有5种,分别是: in:输入端口,信号从该端口进入实体。 out:输出端口,信号从实体内部经该端口输出。 inout:输入输出(双向)端口,信号既可从该端口输入也可从该端口输出。 buffer:缓冲端口,工作于缓冲模式。 Linkage:无指定方向,可与任何方向的信号连接。
(2)用户自定义的数据类型 VHDL语言允许用户自定义数据类型。其书写格式为: type 数据类型名 is 数据类型定义; 例如: type digit is integer range 0 to 9; ——定义digit的数据类型是0~9的整 数 可由用户定义的数据类型有: 枚举(Enumerated)类型; 整数(Integer)类型; 实数(Real)、浮点数(Floating)类型; 数组(Array)类型; 存取(Access)类型; 文件(File)类型; 记录(Record)类型; 时间(Time)类型(物理类型)。
11.1 VHDL语言基础
VHDL语言实现数字电路设计
VHDL语言实现数字电路设计数字电路是由逻辑门、寄存器以及其他数字组件组成的电子系统,用于处理和传输数字信号。
VHDL(Very High-Speed Integrated Circuit Hardware Description Language)是一种硬件描述语言,用于描述数字电路和系统。
通过使用VHDL语言,我们可以实现数字电路的设计,从而满足各种需求。
VHDL语言提供了一种结构化的设计方法,允许设计者描述硬件电路的结构、功能以及时序行为。
以下是一些常见的数字电路设计任务,以及如何使用VHDL语言来实现它们。
1. 门电路设计门电路是最简单的数字电路之一,由逻辑门组成。
使用VHDL语言,我们可以通过描述逻辑门的输入和输出来实现门电路的设计。
例如,我们可以使用VHDL语言描述一个与门:```vhdlentity AND_gate isport (A, B : in bit;Y : out bit);end entity AND_gate;architecture dataflow of AND_gate isbeginY <= A and B;end architecture dataflow;```在这个例子中,我们定义了一个输入端口A和B,以及一个输出端口Y。
在architecture部分,我们使用VHDL语言描述了Y的逻辑值为A和B的逻辑与。
2. 时序逻辑电路设计时序逻辑电路是根据时钟信号进行操作和状态转换的电路。
使用VHDL语言,我们可以描述时序逻辑电路的行为和状态变化。
例如,我们可以使用VHDL语言描述一个触发器:```vhdlentity D_flip_flop isport (D, CLK : in bit;Q : out bit);end entity D_flip_flop;architecture behavior of D_flip_flop issignal Q_temp : bit;beginprocess(CLK)beginif CLK'event and CLK = '1' thenQ_temp <= D;end if;end process;Q <= Q_temp;end architecture behavior;```在这个例子中,我们定义了一个输入端口D和CLK,以及一个输出端口Q。
VHDL教程
LE2 进位输出 (到 LAB中的下一个逻辑单元) 27
FLEX 系列的级联链
性能优越, 适合扇入大的逻辑功能
“与”级联链
2.4 ns
“或”级联链
LE 1
0.6 ns
LE1 IN [3..0] LUT
IN [3..0]
LUT
LE2 IN [4..7] LUT IN [4..7] LUT
LE2
16位地址译码速度可达 2.4 + 0.6x3=4.2 ns
23
连续布线和分段布线的比较
连续布线 ( Altera 基于查找表(LUT)的 FPGA )
LAB
LE
24
连续布线 = 每次设计重复的可预测性和高性能
FLEX 10K系列FPGA结构图
IOC IOC IOC IOC IOC IOC IOC IOC
. . .
. . .
. . .
. . .
嵌入式 阵列块
• EAB的大小灵活可变 256x8 512x4 2048x1
1024x2
• 通过组合EAB 可以构成更大的模块 • 不需要额外的逻辑单元,不引入延迟, EAB 可配置为深度达2048的存储器 512x4 512x4
256x8 256x8
256x16
512x8
30
FLEX 10K 系列的EAB
数据宽度 8,4,2,1 地址宽度 8,9,10,11
什么是查找表?
• 一个N输入查找表 (LUT,Look Up Table)可以实现N个输入 变量的任何逻辑功能,如 N输入“与”、 N输入“异或” 等。 • 输入多于N个的函数、方程必须分开用几个查找表( LUT) 实现
输入1 输入2 查黑 找盒 表子
VHDL
1.3 VHDL的作用
HDL打破软、硬件的界限 传统的数字系统设计分为:
硬件设计(硬件设计人员)
软件设计(软件设计人员) 是硬件设计者和 EDA工具之间的界面
EDA工具及 HDL的流行,使电子系 统向集成化、大规模和高速度等方向发 展。 美国硅谷约有80%的 ASIC和 FPGA/CPLD已采用 HDL进行设计。
一般情况下 USE定义区的格式写成
LIBRARY IEEE; USE IEE.STD_LOGIC_1164.ALL; USE IEE.STD_LOGIC_ARITH.ALL; USE IEE.STD_LOGIC_UNSIGNED.ALL;
2.2 实体声明
实体声明:定义系统的输入输出端口
语法:
ENTITY <entity_name> IS Generic Declarations(类属表); Port Declarations(端口表); END <entity_name>; (1076-1987 version) END ENTITY <entity_name> ; ( 1076-1993 version)
子类型声明;常量声明。
END <包名> ; (1076-1987) END PACKAGE BODY <包名> ; (1076-1993)
例:程序包声明
2、 库
含义:存放预先完成的程序包和数据集合体 的仓库,包含了包或包的汇集 格式:LIBRARY 库名; 种类: STD 库(默认库) IEEE库 WORK库(默认库) 面向ASIC的库 用户定义库
硬件描述语言VHDL
1 概述
1.1 什么是VHDL(HDL)?
VHDL与Verilog语言
VHDL与Verilog语言VHDL(VHSIC hardware description language)和Verilog是用于电子系统设计的硬件描述语言(HDL)。
这两种语言被广泛应用于数字逻辑设计和仿真,以及硬件描述、验证和综合。
1. VHDL(VHSIC hardware description language)VHDL是一种结构化的硬件描述语言,最初由美国国防部高速集成电路计划办公室(VHSIC,Very High Speed Integrated Circuits)开发。
VHDL以其强大的功能和灵活性而闻名,并被广泛用于数字系统的设计和验证。
VHDL的编写包括实体(Entity)和体(Architecture)两个主要部分。
实体部分描述了数字系统的输入输出接口、信号和组件的声明,而体部分描述了实体的内部结构、信号处理和逻辑功能。
VHDL具有丰富的数据类型、运算符和控制结构,可以方便地描述数字电路的行为和结构。
它还提供了强大的仿真和验证功能,使设计人员能够在开发和测试阶段快速迭代和调试设计。
2. VerilogVerilog是一种硬件描述语言,最初由Gateway Design Automation公司(现在是Cadence Design Systems的一部分)开发。
Verilog以其简洁的语法和易学易用的特性而受到广泛欢迎,并成为工业界标准。
Verilog的设计由模块(Module)组成,每个模块描述了一个黑盒子,包含输入和输出端口以及内部的逻辑功能。
模块可以进行层次化组合,从而实现较复杂的系统级设计。
Verilog的语法类似于C语言,具有类似的数据类型、运算符和控制结构。
它还提供了时序建模的能力,使设计人员能够描述数字电路的时序行为。
3. VHDL与Verilog的比较VHDL和Verilog在语法和功能上有一些区别,但它们都可以用于数字电路的设计和仿真。
以下是它们之间的一些比较:3.1 语法风格VHDL采用结构化的编程风格,需要明确的体、过程和信号声明,可以更好地控制和描述系统的结构和行为。
VHDL时序电路的D触发器
D触发器的VHDL描 述
最简单,最常用,最具 代表性的时序原件是D触 发器,它是现代数字系 统设计中最基本的底层 时序单元,甚至是ASIC 设计的基本单元。JK和T 触发器都可由它构建而 来。D触发器的描述包含 了VHDL对时序电路的最 基本和典型的表达方式, 同时也包含了VHD为上升沿的时候,Q输 出D的值;否则,Q保持原值不变
• 设计清0,置数信号的D触发 器 • D触发器由输入的时钟信号 (CLK)、数据输入口(D) 和数据输出(Q)构成。本程 序通过进程监视CLK和D\,当 CLK为上升沿的时候,将D赋 值给Q,要完成这个赋值操作, 必须再借助一个信号S来进行 值的传递
程序
library ieee; use ieee.std_logic_1164.all; entity dff1 is port(clk,d,clr,reset:in std_logic; q:out std_logic); end dff1; architecture exx of dff1 is begin process(clk,clr,reset) begin if (clr='1') then q<='0'; elsif( clk'event and clk='1')then if( reset='0') then q<='1'; else q<=d; end if; end if; end process; end exx
《FPGA系统设计》实验报告》时序逻辑电路的设计
《FPGA系统设计》实验报告》时序逻辑电路的设计
一、设计任务
分别设计并实现锁存器、触发器的VHDL模型。
二、设计过程
1、同步锁存器:
同步锁存器是指复位和加载功能全部与时钟同步,复位端的优先级较高。
下图为同步锁存器的VHDL程序及模型:
2、异步锁存器:
异步锁存器,是指复位与时钟不同步的锁存器。
下图为同步锁存器的VHDL程序及模型:
3、D触发器:
D触发器是最常用的触发器。
下图为简单D触发器的VHDL 模型:
4、T触发器:
T触发器的特点是在时钟沿处输出信号发生翻转。
按
照有无复位、置位信号以及使能信号等,T触发器也有多种类型。
下图为带异步复位T触发器的VHDL模型:
5、JK触发器:
JK触发器中,J、K信号分别扮演置位、复位信号的角色。
为了更清晰的表示出JK触发器的工作过程,以下给出JK触发器的真值表(如表1所示)。
表1 JK触发器真值表
按照有无复位、置位信号,常见的JK触发器也有多种类型,下图带异步复位(clr)、置位(prn)的JK触发器的VHDL模型:
三.总结
本次实验中较为顺利,在第一次课的时间内我就已经完成了必做实验与选作实验。
在实验的过程中,在防抖电路处有了较大的困难。
由于仿真中不存在此问题,在实际操作中参数选择时遇到了一定的困难。
在反复比对效果之后,我
确定了电路的参数,实现了防抖功能。
通过这次实验,我对时钟脉冲、计数器等有了更加深入的认识与理解。
VHDL语言学习
VHDL语言学习VHDL语言学习一、组合逻辑电路的VHDL描述1、实体表达ENTITY e_name ISPORT(p_name:port_m data_type;......P_namei:port_mi data_type)END ENTITY e_name实体描述的是电路期间的端口表达和信号属性2、实体名e_name3、PORT语句和端口信号描述电路的端口及端口信号必须要用到PORT(..);p_name指的是端口信号名4、端口模式port_m定义数据的流动方向和方式IN、OUT、INOUT、BUFFER(输入为内部回读信号)5、数据类型data_typeINTEGER 整数类型BIT位数据类型‘0’’1’需加单引号BOOLEAN布尔数据类型STD_LOGIC标准逻辑位数据类型6、结构体表达ARCHITECTURE arc_name OF e_name IS(说明语句)BEGIN(功能描述语句)END ARCHITECTURE arc_name;(说明语句)不是必须的,包括在结构体中需要说明和定义的数据对象、数据类型、元件调用声明等;(功能描述语句)是必须的。
可以是并行语句、顺序语句,也可以说是混合的。
7、逻辑操作符七种逻辑操作符AND、OR、NAND、NOR、XOR、XNOR、NOT构成组合电路逻辑操作符要求的操作数为三种数据类型BIT、BOOLEAN、STD_LOGIC8、信号传输(赋值)符号和数据比较符号赋值语句y<=a <=表示信号传输或者赋值,两边类型相同比较语句s=’0’=表示一种数据比较符号,语句结果是布尔数据类型9、IF_THEN条件语句顺序语句,必须以END IF结束10、WHEN_ELSE 条件赋值语句并行赋值语句赋值目标<= 表达式WHEN 赋值条件ELSE表达式WHEN 赋值条件ELSE ...........表达式顺序判断赋值,第一句具有最大优先级,判定完成后下面不再执行。
实验三VHDL
4、模7计数器
硬件描述语言1
端口说明: PORT( clk : IN STD_LOGIC; q : OUT INTEGER RANGE 0 TO 6);
功能描述:
VARIABLE cnt : INTEGER RANGE 0 TO 6; BEGIN IF (clk'EVENT AND clk = '1') THEN IF cnt < 6 THEN cnt := cnt + 1; ELSE cnt :=0; END IF; END IF; q <= cnt;
ARCHITECTURE arc_shiftreg OF shiftreg IS SIGNAL q_temp : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS(cr,clk) BEGIN …… …… --见下页 END PROCESS; q<=q_temp; END arc_shiftreg;
假设数据已经被时钟的上升沿打入D触发器,那么数据 到达第一个触发器的Q端需要Tco,再经过组合逻辑的 延时Tdelay到达的第二个触发器的D端,要想时钟能在 第二个触发器再次被稳定的锁入触发器,则时钟的延 迟不能晚于Tco+Tdelay+Tsetup,(回顾建立和保持时 间的概念,就可以理解Tdelay) 由以上分析可知:最 小时钟周期:T=Tco+Tdelay+Tsetup 最快时钟频率 F= 1/T PLD开发软件也正是通过这个公式来计算系统运行 速度Fmax
硬件描述语言2: 功能描述:
IF (clk'EVENT AND clk='1') THEN CASE cnt IS WHEN "000"=>cnt<="001"; WHEN "001"=>cnt<="010"; WHEN "010"=>cnt<="011"; WHEN "011"=>cnt<="100"; WHEN "100"=>cnt<="101"; WHEN "101"=>cnt<="000"; WHEN others=>NULL; END CASE; END IF; q <= cnt;
第5章_VHDL_状态机
p状态机(STATE MACHINE)可以说是一个广义的时序电路,触发器、计数器、移位寄存器都算是他的特殊功能的一种。
在电子设计自动化应用当中,状态机通常是担任CPU的功能,从某种意义上讲,状态机的应用让系统具有了智能化的功能,很多人认为状态机的功能比CPU更强大。
p本章重点介绍用VHDL设计不同类型有限状态机的方法,同时考虑到EDA工具和设计实现中许多必须重点关注的问题,如优化、毛刺信号的处理和编码方式等方面的问题。
5.1 状态机设计相关语句5.1.1 类型定义语句TYPE 数据类型名 IS 数据类型定义 OF 基本数据类型 ;或 TYPE 数据类型名 IS 数据类型定义 ;TYPE st1 IS ARRAY ( 0 TO 15 ) OF STD_LOGIC ;TYPE week IS (sun,mon,tue,wed,thu,fri,sat) ;TYPE m_state IS ( st0,st1,st2,st3,st4,st5 ) ;SIGNAL present_state,next_state : m_state ;TYPE BOOLEAN IS (FALSE,TRUE) ;TYPE my_logic IS ( '1' ,'Z' ,'U' ,'0' ) ;SIGNAL s1 : my_logic ;s1 <= 'Z' ;SUBTYPE 子类型名 IS 基本数据类型 RANGE 约束范围;SUBTYPE digits IS INTEGER RANGE 0 to 9 ;5.1.2 状态机的优势1.状态机的工作方式是根据控制信号按照预先设定的状态进行顺序运行的,是纯硬件数字系统中的顺序控制模型,克服了纯硬件数字系统顺序方式控制不灵活的缺点,因此在运行方式上类似与控制灵活和方便的CPU.2.由于状态机的结构相对简单,设计方案相对固定,而且性能良好的VHDL 综合器都具备许多可控或自动的优化状态机的功能;3、状态机容易构成性能良好的同步时序逻辑模块;4、与VHDL的其他描述方式相比,状态机的VHDL表述丰富多样、程序层次分明,结构清晰,易读易懂;在排错、修改和模块移植方面也有其独到的好处;5、在高速运算和控制方面,状态机更有其巨大的优势。
vhdl是什么意思
VHDL全名Very-High-Speed Integrated Circuit Hardware Description Language,诞生于1982年。
1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。
自IEEE-1076(简称87版)之后,各EDA公司相继推出自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。
1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本,简称93版。
VHDL 和Verilog作为IEEE的工业标准硬件描述语言,得到众多EDA公司支持,在电子工程领域,已成为事实上的通用硬件描述语言。
1.vhdl是什么意思VHDL语言是一种用于电路设计的高级语言。
它在80年代的后期出现。
最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言。
VHDL翻译成中文就是超高速集成电路硬件描述语言,主要是应用在数字电路的设计中。
它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。
当然在一些实力较为雄厚的单位,它也被用来设计ASIC。
VHDL主要用于描述数字系统的结构,行为,功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式、描述风格以及语法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
2.vhdl的作用功能强大、设计灵活VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制。
第5章_VHDL时序电路+状态机+交通灯
时序逻辑电路设计
读懂每一个时序电路的VHDL程 序,能够熟练进行分析。 能够根据已知功能写出相关的 VHDL程序。
重点内容: • 时序逻辑电路的基本概念 • 触发器 • 寄存器 • 计数器
时钟信号
任何时序电路都以时钟信号为驱动信号, 时序电路仅在时钟信号的边沿到来时,其 状态才发生改变。因此,时钟信号通常是 描述时序电路程序的执行条件. 另外,时序电路也总是以时钟进程的形式 进行描述的。
(三).计数器
1.计数器简介
定义: 数字电路中用来记忆时钟脉冲个数的逻辑电 路。 原理:采用几个触发器的状态,按照一定规 律随时钟变化来记忆时钟的个数。 计数器的模:一个计数器所能记忆时钟脉冲 的最大数目。
1.计数器简介
计数器的分类
1、同步计数器、异步计数器。
2、加法计数器、减法计数器和可逆计数器。
IF (clk′EVENT AND clk=′0′) THEN WAIT UNTIL clk=‘0’; IF (clk’last_value=‘1’ AND clk’event AND clk=‘0’) THEN
IF (falling_edge(clk)) THEN
复位信号
同步复位,就是当复位信号有效且在给 定的时钟边沿到来时,触发器才被复位 。换一句话说,即使复位信号有效,如 果时钟脉冲边沿未到来,触发器也不会 复位。 非同步复位则不同,一旦复位信号有效 ,触发器就立即复位。
第5章 VHDL基本逻辑电路设计
--时序逻辑电路
时序逻辑电路概述
回顾:
组合逻辑电路:任意时刻的输出仅取决于该 时刻数据的输入,与电路原来的状态无关。 时序逻辑电路:是指数字电路在任何时刻的 输出不仅取决于当时的输入信号,而且还取决 于电路原来的状态,或者说和以前的输入有关。
vhdl教程
名 • 例子 type week is array (1 to 7) of integer; type deweek is array (1 to 7) of week;
VHDL培训教程
第一讲、VHDL简介及其结构 第二讲、VHDL中的对象、操作符、数据类型 第三讲、VHDL中的控制语句及模块 第四讲、状态机的设计
第一讲、VHDL简介及其结构
• 通过本课的学习您可以了解以下几点 1、VHDL 的基本概念 2、VHDL的基本结构 3、VHDL的设计初步
什么是VHDL
例如:1.0、2.834、3.14、0.0
VHDL 的基本类型
9、natural 自然数 和 positive 正整数 10、senverity level (常和assert语句配合使用)
包含有:note、warning、error、failure
• 以上十种类型是VHDL中的标准类型,在编程 中可以直接使用。使用这十种以外的类型,需 要自行定义或指明所引用的Library(库)和 Package(包)集合
• VHDLVHSIC Hardware Decription Language
其中VHSICVery High Speed Integrated Circuit
电子设计自动化的关键技术之一是要求用形式化 方法来描述硬件系统。VHDL适应了这种要求。
VHDL和Verilog HDL
• Verilog HDL: 另一种硬件描述语言,由Verilog 公司开 发,1995年成为IEEE标准。 优点:简单、易学易用 缺点:功能不如VHDL强大,仿真工具少
procedure(过程)
实验三_VHDL时序逻辑电路设计
实验三实验三 VHDL VHDL VHDL 时序逻辑电路设计时序逻辑电路设计 一、实验目的一、实验目的1. 熟悉用VHDL 语言设计时序逻辑电路的方法语言设计时序逻辑电路的方法 2. 熟悉用Quartus 文本输入法进行电路设计文本输入法进行电路设计 二、实验所用仪器元件及用途二、实验所用仪器元件及用途 1. 计算机:装有Quartus 软件,为VHDL 语言提供操作场所。
语言提供操作场所。
2. 直流稳压电源:通过USB 接口实现,为实验开发板提供稳定电源。
接口实现,为实验开发板提供稳定电源。
3. 数字系统与逻辑设计实验开发板:使试验结果下载到开发板上,实现整个实验的最终结果。
果。
三、实验内容三、实验内容 1. 用VHDL 语言设计实现一个8421码十进制计数器。
码十进制计数器。
(1) 实验内容及要求:在Quartus 平台上设计程序和仿真题目要求,并下载到实验板上验证试验结果。
验证试验结果。
(2) 试验结果:VHDL 代码和仿真结果。
代码和仿真结果。
2. 用VHDL 语言设计实现一个分频系数为8,分频输出信号占空比为50%的分频器。
的分频器。
(1) 实验内容及要求:在Quartus 平台上设计程序和仿真题目要求。
平台上设计程序和仿真题目要求。
(2) 试验结果:VHDL 代码和仿真结果。
代码和仿真结果。
3. 用VHDL 语言设计实现一个控制8个发光二极管亮灭的电路。
个发光二极管亮灭的电路。
(1) 实验内容及要求:在Quartus 平台上设计程序和仿真题目要求,并下载到实验板上验证试验结果。
验证试验结果。
a. 单点移动模式:一个点在8个发光二极管上来回的亮个发光二极管上来回的亮b. 幕布式:从中间两个点,同时向两边依次点亮直至全亮,然后再向中间点灭,依次往复往复c. 通过拨码开关或按键控制两种模式的转换通过拨码开关或按键控制两种模式的转换 (2) 试验结果:VHDL 代码和仿真结果。
基于VHDL的IIC时序电路设计
基于VHDL的IIC时序电路设计iic 总线在设计时要看你所使用的器件的传输或接收时序只要会一个,其他的都一样以下是我在一本书上看到的,你看看就会用了library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity reciver isport(reset,clk:in std_logic;sda,scl:inout std_logic;rd:out std_logic;tdata:in std_logic_vector(7 downto 0);rdata:out std_logic_vector(7 downto 0));end reciver;architecture one of reciver issignal rdatai:std_logic_vector(7 downto 0);type state is (start,transmit,ack,sub,ack1,start1,slave,ack2,reading,ack3); signal current:state;beginprocess(clk,reset)variable count:integer range 0 to 40;variable cnt:integer range 0 to 8;beginif reset='1'thensda<='1';scl<='1';rdata<="00000000";current<=start;cnt:=8;count:=0;elsif clk'event and clk='1' thencase current iswhen start=>count:=count+1;case count iswhen 1=>sda<='1';when 2=>scl<='1';when 3=>sda<='0';when 4=>scl<='0';when 10=>count:=0;current<=transmit;end case;when transmit=>count:=count+1;case count iswhen 1=>sda<=tdata(cnt);when 2=>scl<='1';when 3=>scl<='0';when 4=>cnt:=cnt-1;count:=0;if cnt=0 then cnt:=8;current<=ack;rd<='1'; else current<=transmit;rd<='0';end if;when others=>null;end case;when ack=>count:=count+1;case count iswhen 1=>sda<='0';when 2=>scl<='1';when 3=>scl<='0';when 4=>current<=sub;count:=0;when others=>null;end case;when sub=>count:=count+1;case count iswhen 1=>sda<=tdata(cnt);when 2=>scl<='1';when 3=>scl<='0';when 4=>cnt:=cnt-1;count:=0;if cnt=0 then cnt:=8;current<=ack1;rd<='1'; else current<=sub;rd<='0';end if;when others=>null;end case;when ack1=>count:=count+1;case count iswhen 1=>sda<='0';when 2=>scl<='1';when 4=>current<=start1;count:=0;when others=>null;end case;when start1=>count:=count+1;case count iswhen 1=>sda<='1';when 2=>scl<='1';when 3=>sda<='0';when 4=>scl<='0';when 5=>current<=slave;count:=0;when others=>null;end case;when slave=>count:=count+1;case count iswhen 1=>sda<=tdata(cnt);when 2=>scl<='1';when 3=>scl<='0';when 4=>cnt:=cnt-1;count:=0;if cnt=0 then cnt:=8;current<=ack2;rd<='1'; else current<=sub;rd<='0';end if;when others=>null;end case;when ack2=>count:=count+1;case count iswhen 1=>sda<='0';when 2=>scl<='1';when 3=>scl<='0';when 4=>current<=reading;count:=0;when others=>null;end case;when reading=>count:=count+1;case count iswhen 1=>sda<='1';when 4=>scl<='1';when 8=>rdatai(cnt)<=sda;when 10=>scl<='0';when 12=>cnt:=cnt-1;count:=0;if cnt=0 then cnt:=8;current<=ack3;rd<='1';else current<=reading;rd<='0';end if;when others=>null;end case;when ack3=>count:=count+1;case count iswhen 1=>sda<='0';when 2=>scl<='1';when 3=>scl<='0';when 4=>rdata<=rdatai;current<=start;count:=0;when others=>null;end case;end case;end if;end process;end architecture;TOP↑。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前几节,我们讲解的都是组合逻辑电路。
通过这些组合逻辑电路,我们初步掌握了VHDL常用的语法结构。
从这节开始,我们要介绍时序电路了。
(其实我们没有刻意去分组合和时序,只是觉的前面组合讲的多点,后面可能会多讲些时序电路而已。
对小平爷爷曾经说过:不管黑猫,白猫,只要能捉到老鼠的猫就是好猫。
所以不论时序,组合,还是时序和组合的混合体,只要能实现功能的就是好程序!)
说一下概念:异步和同步。
这是时序电路的两大类。
同步就是电路的触发器由同一个时钟信号驱动,在同一个时刻翻转;而异步就是不在同一个时刻翻转。
大多数编程器的的内部结构是同步时序逻辑电路。
我们以时序电路的基础单元D触发器说起。
上升沿D触发器逻辑符号:
由功能表可知,一个D触发器有一个异步置零端Rd,异步置1端Sd,只要Rd或
Sd有效(低电平),则D触发器就会立即复位或则置1操作,复位与置1操作是与是时钟无关的,是异步的,有一个输入端D,一个时钟输入端CP,有两个互补的输出端Q和Q
源代码:(工程见example中的D_FF文件夹)
逐行解释:
19~33:是一个有嵌套的IF结构。
这个IF结构就是按照功能表的顺序来写的。
25:是一条功能表没有的语句,在这种情况下,信号输出不确定,即用’X’来表示。
这儿要考虑到选择信号的完备性:Rd和Sd的组合会形成4种可能,若没有第25句的话,那么28~32可在Rd=’0’且Sd=’0’和Rd=’1’且Sd=’1’两种情况下运行。
这个是不符合功能要求的。
这里提醒大家一句:编写程序,不仅仅是VHDL程序,心一定要细。
29:用到了一个内置函数rising_edge(),即表示信号的上升沿,相对的就是falling_edge()。
该句等同于(if CP’event and CP=’1’),意思是CP上有事件发生,且事件发生后CP是高电平。
(事件无非就是上升和下降,若事件后是高电平,那就是上升沿发生了!)这两个函数在以后会经常用到的。
注意:因为是Sd,Rd是异步信号,即该信号不等待时钟的某一状态,而是直接起作用。
所以对这两种信号的判断应该在时钟的判断之前,即放在第29句之前判断。
再介绍下寄存器和移位寄存器这两种单元电路的实现,它们是数字电路中许多复杂时序电路的基础。
掌握它们的VHDL描述也很重要。
先介绍由D触发器构成的8位寄存器74LS374.
8位寄存器74ls374逻辑符号:
d0-d7,一个三态控制端oe和8个数据输出端d0-d7。
当oe=0(有效)且时钟上升沿到来时,数据d0-d7送到输出端q0-q7;当oe=0(有效)但时钟上升沿没有到来时,寄存器输出端维持原来的状态;当oe=1(无效时)寄存器输出端维持高阻态。
源代码:
波形仿真图:
逐行解释:
我想这里只有两点需要解释和提醒一下:
(1)每个IF都有一个END,不要遗漏了。
还要注意哪个IF条件在外面,哪个IF条件在里面。
如第21句的IF就是在第20句的IF里面的。
(2)第25句:这是一种化简写法,就是说Q的所有内容都是Z,等同于Q<=”ZZZZ_ZZZZ”。
这里只有8个Z,写起来还简单些。
但当Q为32位或则64位时,难道还真去写这么多个Z啊?眼睛都看花了。
呵呵,所以呢,有了这个OTHERS=>’Z’的偷懒写法。
(OTHERS右边的值可任意设定的,Z只是个举例)
趁热打铁,再来一个循环左移位寄存器。
(工程见example下的left_shifter_loop 文件夹)
左循环移位寄存器。
假如左移3位,则移动示意如下图所示:
根据移动关系可得到如下的移动计算公式(简单的小学数学问题):
ⅰ若当前数据位的当前序号(0—7)加上移动的次数大于数组长度(这里的数组长度是实际数组长度-1,如是8位的长度,则减一就是7),则该位将移动到:当前序号+移动次数-数组长度-1
ⅱ若当前数据位的序号加上移动的次数小于数组长度,则该位移动到:当前序号+移动次数
根据如上的计算方法,就可以编写出循环左移的程序。
程序代码如下:
逐行解释:
18:移动次数暂存寄存器。
最大就移动8次。
22-23:当load=0时,将移动次数装载进来,conv_integer()将std_logic_vector转变为integer后赋值给CNT_S。
25-35:当上升沿来后,通过一个for循环进行移位。
27-28,就是ⅱ种情况,29-30,就是ⅰ种情况
注意:FOR 的两边循环值必须是常量
该循环中一个时钟周期内就完成所要求的移位量,并非一个时钟才移动一位,这个是与很多教科书上不同的.
FOR语句语法点:
1 属性
2 FOR ..LOOP 语句.语法:
[标号:] FOR 循环变量IN 循环次数范围LOOP
顺序语句;
END LOOP;
几点注意:1.循环变量是自动定义的,直接用就可以
2 循环次数范围有两种情况:初值TO 终值,终值须大于初值,循环变量做自增运算;终值DOWNTO 初值,初值须小于终值,循环变量做自减运算
3 终值和初值须是常量,不能用变量,这点一定要清楚,因为与C有很大的差别
(C中的循环次数是可以变的)
该语句的操作过程:从循环变量的初值(或终值)开始,每执行一次循环体内的顺序语句后,循环变量自增(或自减),直到循环变量的值大于终值(或小于初值)为止,然后跳出LOOP,继续执行END LOOP后的语句.。