时序电路VHDL讲解
- 格式:doc
- 大小:162.50 KB
- 文档页数:6
实验三 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(VHSIC Hardware Description Language)是用于描述数字电路和系统的硬件描述语言,是一种标准化的硬件描述语言,广泛应用于数字电路设计和电子系统设计领域。
VHDL语言是一种强大的工具,可以帮助工程师描述复杂的数字电路,并进行仿真和综合。
它可以描述电路的结构、功能和时序行为,是一种形式化的语言,能够准确地描述电路的行为特性,有助于工程师在设计阶段发现和解决问题。
VHDL语言的基本概念实体(Entity)•实体描述了电路的接口和功能,可以看作是一种抽象的模块。
•实体中定义了输入输出端口,以及对应的信号类型和位宽。
•实体可以包含多个体系结构(Architecture)。
体系结构(Architecture)•体系结构描述了实体的具体实现,定义了实体的行为。
•体系结构中包含了处理逻辑、时序行为以及信号的赋值。
•体系结构可以描述电路的功能和行为。
信号(Signal)•信号是VHDL语言中的基本数据类型,用于在电路中传递信息。
•信号可以是标量(Scalar)或矢量(Vector),可以是时序或组合。
•信号的赋值可以是同步的或异步的。
过程(Process)•过程描述了VHDL中的行为,通常用于描述组合逻辑或时序逻辑。
•过程中可以包含逻辑运算、条件语句、循环语句等。
•过程中的代码在仿真或综合时会被执行。
VHDL语言的应用VHDL语言主要用于数字电路设计、电子系统设计、FPGA设计等领域。
工程师可以使用VHDL语言描述数字电路的结构和行为,进行仿真和综合,快速验证设计的正确性。
VHDL语言的应用领域包括但不限于:•数字电路设计•通信系统设计•控制系统设计•图像处理系统设计•嵌入式系统设计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与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采用结构化的编程风格,需要明确的体、过程和信号声明,可以更好地控制和描述系统的结构和行为。
《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描述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 ...........表达式顺序判断赋值,第一句具有最大优先级,判定完成后下面不再执行。
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全名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具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制。
实验三实验三 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时序电路设计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↑。
前几节,我们讲解的都是组合逻辑电路。
通过这些组合逻辑电路,我们初步掌握了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后的语句.。