EDA实验数控分频器的设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

***大学本科实验报告(2011-2012学年下学期)

课程名称:EDA

任课教员:

系:

专业:

二0一一年十月八日

《EDA》课程实验报告

实验项目名称:数控分频器的设计

系::专业:指导教员:

姓名:学号:成绩:

同组姓名:

实验地点:实验室实验日期:

数控分频器的设计一、实验目的和要求

学习数控分频器的设计、分析和测试方法。

二、实验内容和原理

1、实验内容:

a)分析程序一中的各语句功能、设计原理及逻辑功能,详述进程

P_REG和P_DIV的作用,并画出该程序的RTL电路图;

b)仿真:输入不同的CLK频率和预置值D,给出如书图6-21的

时序波形。

c)将程序一扩展成16位分频器;

d)利用两个程序一给出的模块设计一个电路,使其输出方波的正

负脉宽的宽度分别由两个8位输入数据控制。

2、实验原理:

数控分频器的功能就是当在输入端给定不同输入数据时,将对输入的时钟信号有不同的分频比,数控分频器就是用计数值可并行预的加法计数器设计完成的,方法是将计数溢出位与预置数加载输入信号相接即可,详细设计程序如程序一。

三、实验环境

QuartⅡ软件

四、操作方法与实验步骤

1、在QuartⅡ中建立工程,进行程序编写、调试、编译、仿真,设置CLK频率和D为不同值;

2、分析程序一,类推出16位分频器的设计方法;

3、仔细分析程序一中如何控制正负脉宽的宽度,采用元件例化语句,将DVF和SEL2两个VHDL设计实体组合起来,设计如题中要求的电路,具体程序见程序三,并按步骤1执行。

五、实验数据记录和处理

将程序进行仿真得到的波形图如下所示:

(1)8位数控分频器

(2)16位数控分频器

(3)正负脉冲宽度可变分频器

六、实验结果与分析:

仿真结果基本正确,但在对16位数控分频器做仿真时应把endtime设置在ms级以上,即仿真时长要稍长些,才能出来明显结果。正负脉冲宽度可变分频器的正负脉冲宽度分别由D1和D2控制,其基本原理与8位数控分频器原理一致。

七、实验心得与体会

通过该实验,我掌握了数控分频器的工作原理及其设计方法,学会了元件例化语句的使用。

八、程序代码

程序一:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY DVF IS

PORT( CLK:IN STD_LOGIC;

D:IN STD_LOGIC_VECTOR(7 DOWNTO 0); FOUT:OUT STD_LOGIC);

END;

ARCHITECTURE one OF DVF IS

SIGNAL FULL:STD_LOGIC;

BEGIN

P_REG:PROCESS(CLK)

VARIABLE CNT8:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN

IF CLK 'EVENT AND CLK='1' THEN

IF CNT8="11111111" THEN

CNT8:=D;

FULL<='1';

ELSE CNT8:=CNT8+1;

FULL<='0';

END IF;

END IF;

END PROCESS P_REG;

P_DIV:PROCESS(FULL)

VARIABLE CNT2:STD_LOGIC;

BEGIN

IF FULL 'EVENT AND FULL='1' THEN

CNT2:=NOT CNT2;

IF CNT2='1' THEN FOUT<='1';ELSE FOUT<='0'; END IF;

END IF;

END PROCESS P_DIV;

END ;

程序二:

L IBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY DVF16 IS

PORT( CLK:IN STD_LOGIC;

D:IN STD_LOGIC_VECTOR(15 DOWNTO 0);

FOUT:OUT STD_LOGIC);

END;

ARCHITECTURE one OF DVF16 IS

SIGNAL FULL:STD_LOGIC;

BEGIN

P_REG:PROCESS(CLK)

VARIABLE CNT8:STD_LOGIC_VECTOR(15 DOWNTO 0);

BEGIN

IF CLK 'EVENT AND CLK='1' THEN

IF CNT8="1111111111111111" THEN

CNT8:=D;

FULL<='1';

ELSE CNT8:=CNT8+1;

FULL<='0';

END IF;

END IF;

END PROCESS P_REG;

P_DIV:PROCESS(FULL)

VARIABLE CNT2:STD_LOGIC;

BEGIN

IF FULL 'EVENT AND FULL='1' THEN

CNT2:=NOT CNT2;

IF CNT2='1' THEN FOUT<='1';ELSE FOUT<='0'; END IF;

END IF;

END PROCESS P_DIV;

END ;

相关文档
最新文档