高血压专题网,内容丰富有趣,生活中的好帮手!
高血压专题网 > 笔记:FPGA与VHDL语言学习2

笔记:FPGA与VHDL语言学习2

时间:2022-02-15 07:54:24

相关推荐

笔记:FPGA与VHDL语言学习2

FPGA与VHDL语言学习2

目录

1. 7位2进制计数器程序,要求计算器从0开始计数,计数到59(十进制的59,看到的是二进制数)后归零,重新循环计数

2. 2位十进制计数器程序,要求计数器从00开始计数,计数到53(十进制的53,看到的是十进制数53)后归零,重新循环计数,进行仿真测试

3. 2位十进制计数器程序,要求计数器从00开始计数,计数到83后归零,重新循环计数,进行仿真测试

4. 半整数与奇数分频器设计

1、参考PPT第五章第二节的4位2进制计数器程序,设计一个7位2进制计数器程序,要求计算器从0开始计数,计数到59(十进制的59,看到的是二进制数)后归零,重新循环计数,进行仿真测试。把计数器程序及仿真测试图通过作业系统上交,并说明仿真测试结果正确的理由。

(1)十进制0-59 加法计数器的VHDL设计

加法计数器中RANGE限定了取数范围为590,在综合器编译时自动处理成六位二进制矢量。在计数器表达式中Q,=Q+1可见,Q应该具有两种端口模式特性,同时他的输入特性应该是反馈方式,因此定义Q的端口模式为buffer。最后判断当Q累加为60时,将Q置零,这样Q即显示为059的累加器。

在如下的仿真图中,在第910ns时,Q1=3B(H)=111011(B)=59(D),在下一时刻Q1即为0,加法计数器计数成功。

(2)十进制0-59 更常用的计数器的VHDL设计

在(2)中,与(1)不同的是电路的所有端口的数据类型都定义为标准逻辑位或位矢量,且定义了中间节点信号。这样的好处是比较容易与其他电路模拟接口。其中,在判断时,当Q1=111100(B)=60(D)时,Q1 <= “000000” 使其置零。

其仿真波形图与(1)相同,在第880ns时,Q1=3B(H)=111011(B)=59(D),在下一时刻Q1即为0,这种更常用的计数器计数成功。

(3)十进制0-59 实用计数器的VHDL设计

在本计数器中一个带有异步复位和同步加载功能的0~59(D)加法计数器。

其中程序功能分别为:时钟信号CLK,复位信号RST,时钟使能信号EN,加载信号LOAD,输出进位信号COUT。

程序思想:当RST低电平时计数寄存器清零,测试时钟上升沿,计数器高电平使能,允许计数。与之控制低电平,允许加载。计数小于59,继续累加,否则计数清零。当计数为59时,进位输出为1,否则进位输出0。最后将寄存器的值输出端口。

其仿真图与下一种描述相同。

(4)十进制0-59 实用计数器的VHDL设计 (另一种方式描述)

在(3)的语句中含有两个独立的IF语句,第一个IF语句产生了计数器序列电路,第二个IF语句产生一个纯组合逻辑的多路选择器。

实际上,从程序的结构上讲,更一般更常用的表述是,将这两个独立的IF语句分别用两个独立的进程语句来表达,一个为时序进程,另一个为组合进程。

为方便观察将DATA和DOUT设置为16进制。

输出进位COUT在约为350ns时为1,其他时刻为0,这是由于在350ns时DOUT=3B(H)=59(D)

当时钟使能EN为1时,DOUT开始计数。

当重置RST由0变为1后,DOUT重新从0开始计数。

当LOAD有一个下降沿时,将输入DATA中的数据加载到输出DOUT中,再一次为基础向后计数。

再约为350ns后DOUT=3B(H)=59(D),计数器重新从0来计数。

再下图中可以更清晰地看到在第350ns时情况,DOUT为111011(B)=59(D),输出进位COUT=1。

1、参考PPT第五章第二节的1位实用十进制计数器程序,设计一个2位十进制计数器程序,要求计数器从00开始计数,计数到53(十进制的53,看到的是十进制数53)后归零,重新循环计数,进行仿真测试。把计数器程序及仿真测试图通过作业系统上交,并说明仿真测试结果正确的理由。

(1)二位 十进制计数器CNT54 (从0计数至53)

在本计数器中一个带有异步复位和同步加载功能的0~53(D)加法计数器。

其中程序功能分别为:高位H与Q1,低位L与Q2,时钟信号CLK,复位信号RST,时钟使能信号EN,输出进位信号COUT,高位加载信号LOADH,低位加载信号LOADL。(DATA是四位二进制随机数)

程序思想:当RST低电平时计数寄存器清零,测试时钟上升沿,计数器高电平使能,允许计数。与之控制低电平,允许加载。当低位L大于9时,低位L计数清零并向高位H进一。当计数为53时,高位与低位都清零,进位输出为1,否则进位输出0。最后将寄存器的值输出端口。

为方便观察将DATA和Q1,Q2设置为Unsigned Decimal(无符号十进制)。

依次检测下列条件:

1)【CLK是输入时间脉冲信号】

2)【当时钟使能EN=1时,Q1Q2开始计数,若EN=0,则Q1Q2保持原数据】

如:前20ns,EN=0,Q1Q2数据不变。

3)【当重置RST由1变为0后,Q1 Q2重新从0开始计数】

如:在第390ns,RST=0,Q1 Q2从0开始计数。

4)【当LOADH有一个下降沿时,将输入DATA中的数据加载到输出Q1中,再以此为基础向后计数】

如:在第110ns时,LOADH=0,则在下一时刻Q1=DATA=4。

5)【Q1 Q2=53(D)后,输出进位COUT=1,计数器重新从0计数】

如:在第200ns时,Q1 Q2=53(D),则在第210ns,进位COUT=1,并计数器从0开始计数。

(2)两位 十进制计数器CNT54 的VHDL设计 (另一种方式VHDL描述)

在(1)的语句中含有两个独立的IF语句,第一个IF语句产生了计数器序列电路,第二个IF语句产生一个纯组合逻辑的多路选择器。

实际上,从程序的结构上讲,更一般更常用的表述是,将这两个独立的IF语句分别用两个独立的进程语句来表达,一个为时序进程,另一个为组合进程。

其仿真波形图同上

代码附录:

LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT54 ISPORT (EN, CLK, RST, LOADL,LOADH : IN STD_LOGIC;Q1, Q2 : OUT STD_LOGIC_VECTOR (3 DOWNTO 0); DATA : IN STD_LOGIC_VECTOR (3 DOWNTO 0);COUT : OUT STD_LOGIC);END CNT54;ARCHITECTURE CNT54_ljj OF CNT54 ISBEGINPROCESS(EN)VARIABLE H : STD_LOGIC_VECTOR (3 DOWNTO 0); VARIABLE L : STD_LOGIC_VECTOR (3 DOWNTO 0);BEGINIF RST='0' THENH:="0000" ;L:="0000" ;ELSIF(EN='1' ) THENIF (CLK' EVENT AND CLK='1') THENELSIF(EN='1' )THENIF (LOADL='0') THEN L:=DATA; ELSE IF (LOADH='0') THEN H:=DATA; ELSE IF (CLK'EVENT AND CLK='1') THENIF L="1001" THENL := "0000"; H := H+1;ELSE IF (H="0101" ) AND (L="0011") THENH := "0000" ; L := "0000"; ELSE L:=L+1;COUT <= '0';END IF; END IF;END IF;END IF;END IF;END IF;END IF;END IF;Q1 <= H; Q2 <= L;END PROCESS;END CNT54_ljj;

1、参考以前学习过的数字电路课程,用数字电路计数器芯片(如74LS161,162,90等),用电路图形式(计数器元件可以从系统中选择)设计一个2位十进制计数器程序,要求计数器从00开始计数,计数到83后归零,重新循环计数,进行仿真测试。把计数器设计图形及仿真测试图通过作业系统上交,并说明仿真测试结果正确的理由。

1、设计电路原理图

设计含有时钟使能及进位扩展输出的两位十进制计数器。可以用JK/D触发器、双十进制计数器74LS390或者十进制计数器74LS160和其他一些辅助元件来完成。

(1)硬件设计思想:

24<84<28,因此在设计中要用到两片74161芯片。这是一个CNT84,计数至84(0101 0100)时,下一时刻当从0开始计数;即当Q6 Q4 Q2都为1时,将0下载进计数器中;因此使用3与非门连接Q6 Q4 Q2,输出端连CLRN即可清零。

(2)引脚功能:

输入有异步清零控制端CLRN、工作使能控制端ENP、ENT和时钟输入端CLK,输出有BCD码计数值输出端Q3~Q0,进位输出端RCO。

(3)步骤:

新建BDF文件,保存工程。将所需要的元器件和引脚拖入区域内并完成连接,如图所示

2.仿真图验证

建立VWF文件,仿真后得到结果如下图,

计数器从零开始按自然顺序计数,在第830ns时,Q为83(unsigned Dec),然后下一时刻Q为0重新按顺序计数,证明设计正确。

其中EN为使能管脚,CLK为输入时钟信号。

4.参考PPT第五章的实验与设计,对其中的5-3(半整数与奇数分频器设计),这里包含图5-23 、例5-20、图5-25相对应的电路图及程序。对不同的分频器进行仿真测试,如果修改M3(模3)的计数器变成M5或M7,会得到怎样的结果,把仿真测试结果通过作业系统上交,说明电路及程序的功能。

(1)如图所示的电路是一个占空比为50%的任意奇数次分频电路。其中的count5是一个模5计数器,它可以设置为任意模计数器,实现整个电路任意次奇数分频功能,且占空比均为50%。

注意:其中,模3模5等的计数器设计可以通过VHDL来进行底层电路模块设计,也可以通过LPM设计模块。

在本实验中,模3计数器通过LPM设计,再导入到元件库中,以供分频电路使用。

A. 下图是将电路中的计数器换成 模3计数器(M3) 后的仿真图。C1的输出呈现50%占空比5分频信号。

B. 下图是将电路中的计数器换成 模5计数器(M5) 后的仿真图。C1的输出呈现50%占空比9分频信号。

C. 下图是将电路中的计数器换成 模7计数器(M7) 后的仿真图。C1的输出呈现50%占空比13分频信号。

(2)另一种设计50%占空比任意奇数分频的设计思路是使用VHDL语言。下图是50%占空比5分频的VHDL程序。

下图是50%占空比5分频的VHDL设计程序的仿真图。输出K_OR实现了该程序功能。

(3)使用数字系统常用常需要另一种分频电路,即半整数分频。只要对电路稍加改变就可以得到任意半整数分频电路,对如下图所是的电路只要改变M3(模3计数器)模块的技术数值,即可改变此电路所需要的半整数分频结构。

A. 如下图是上图的仿真波形,输出C显示2.5分频

B. 下图是将电路图中计数器模块改为 模5计数器 后的仿真波形,输出C显示4.5分频

C. 下图是将电路图中计数器模块改为 模7计数器 后的仿真波形,输出C显示6.5分频

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。