数控分频器实验报告

更新时间:2023-10-02 16:12:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《数控分频实验》

姓名:谭国榕 班级:12电子卓越班 学号:201241301132

一、实验目的

1.熟练编程VHDL语言程序。

2.设计一个数控分频器。 二、实验原理

本次实验我是采用书上的5分频电路进行修改,通过观察其5分频的规律进而修改成任意奇数分频,再在任意奇数分频的基础上修改为任意偶数分频,本次实验我分为了三个部分,前两部分就是前面所说的任意奇数分频和任意偶数分频,在这个基础上,再用奇数输入的最低位为1,偶数最低位为0的原理实现合并。

三、实验步骤

1.任意奇数分频

程序:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY DIV1 IS

PORT(CLK:IN STD_LOGIC;

D:IN INTEGER RANGE 0 TO 255; K1,K2,K_OR:OUT STD_LOGIC ); END;

ARCHITECTURE BHV OF DIV1 IS

SIGNAL TEMP3,TEMP4:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL M1,M2:STD_LOGIC;

--SIGNAL OUT1,OUT2,OUT3:STD_LOGIC; BEGIN

PROCESS(CLK,TEMP3) BEGIN IF RISING_EDGE(CLK) THEN

IF(TEMP3=D-1) THEN TEMP3<=\

IF(TEMP3=D-(D+3)/2) THEN M1<=NOT M1; ELSIF (TEMP3=D-2) THEN M1<=NOT M1; END IF; END IF; END PROCESS;

PROCESS(CLK,TEMP4) BEGIN IF FALLING_EDGE(CLK) THEN

IF(TEMP4=D-1) THEN TEMP4<=\

IF(TEMP4=D-(D+3)/2) THEN M2<=NOT M2; ELSIF (TEMP4=D-2) THEN M2<=NOT M2;

END IF; END IF; END PROCESS;

K1<=M1; K2<=M2; K_OR <=M1 OR M2; END BHV;

此段程序最主要的部分为:

PROCESS(CLK,TEMP3) BEGIN IF RISING_EDGE(CLK) THEN

IF(TEMP3=D-1) THEN TEMP3<=\

IF(TEMP3=D-(D+3)/2) THEN M1<=NOT M1; ELSIF (TEMP3=D-2) THEN M1<=NOT M1; END IF; END IF; END PROCESS;

PROCESS(CLK,TEMP4) BEGIN IF FALLING_EDGE(CLK) THEN

IF(TEMP4=D-1) THEN TEMP4<=\

IF(TEMP4=D-(D+3)/2) THEN M2<=NOT M2; ELSIF (TEMP4=D-2) THEN M2<=NOT M2; END IF; END IF; END PROCESS;

在这里,我通过研究书上的占空比为50%的5分频电路的程序,通过实验发现了一个规律,就是书上的C1=\,在奇数任意分频中为输入信号减一,即D-1,而在第二个if里,5分频为C1=\,7分频为C1=\,9分频为C1=\,以此类推,则不难发现: 5-4=1;7-5=2;9-6=3.。。。即为程序中的TEMP4=D-(D+3)/2;而ELSIF里的C2=\则为我程序中的TEMP4=D-2。通过这样的修改就可以实现任意奇数分频。

程序仿真: 3分频:

5分频:

7分频:

2.任意偶数分频

程序:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY DIV2 IS

PORT(CLK:IN STD_LOGIC;

D:IN INTEGER RANGE 0 TO 255; K1:OUT STD_LOGIC ); END;

ARCHITECTURE BHV OF DIV2 IS

SIGNAL TEMP3,TEMP4:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL M1:STD_LOGIC;

--SIGNAL OUT1,OUT2,OUT3:STD_LOGIC; BEGIN

PROCESS(CLK,TEMP3) BEGIN IF FALLING_EDGE(CLK) THEN

IF(TEMP3=D-1) THEN TEMP3<=\

IF(TEMP3=D-(D+2)/2) THEN M1<=NOT M1; ELSIF (TEMP3=D-1) THEN M1<=NOT M1; END IF; END IF; END PROCESS; K1<=M1; END BHV;

此段程序比任意奇数分频简单,原因是偶数分频所用到的周期是整数,例如二分频那么就要用到4个周期,占空比为50%则为高电平两个周期,低电平两个周期,而任意奇数分频则需要半个周期的高电平或低电平,故需要两个信号相或。任意偶数分频的原理与任意奇数分频的原理相似,同样是我在书上的程序上修改而来,其中最重要的是发现其变化规律。 程序仿真: 2分频:

4分频:

8分频:

3.数控分频

程序:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;

ENTITY DIV IS

PORT(CLK_IN:IN STD_LOGIC;

D:IN INTEGER RANGE 0 TO 255; CLK_OUT:OUT STD_LOGIC ); END;

ARCHITECTURE BHV OF DIV IS

SIGNAL C1,C2,C3,D1:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL M1,M2,M3:STD_LOGIC; BEGIN

PROCESS(CLK_IN,C1) BEGIN

D1<=CONV_STD_LOGIC_VECTOR(D,8); IF D1(0)='1' THEN

IF RISING_EDGE(CLK_IN) THEN

IF(C1=D-1) THEN C1<=\

IF(C1=D-(D+3)/2) THEN M1<=NOT M1; ELSIF (C1=D-2) THEN M1<=NOT M1; END IF; END IF;END IF; END PROCESS;

PROCESS(CLK_IN,C2) BEGIN

D1<=CONV_STD_LOGIC_VECTOR(D,8); IF D1(0)='1' THEN

IF FALLING_EDGE(CLK_IN) THEN

IF(C2=D-1) THEN C2<=\

IF(C2=D-(D+3)/2) THEN M2<=NOT M2; ELSIF (C2=D-2) THEN M2<=NOT M2; END IF; END IF;END IF; END PROCESS;

PROCESS(CLK_IN,C3) BEGIN

D1<=CONV_STD_LOGIC_VECTOR(D,8); IF D1(0)='0' THEN

IF FALLING_EDGE(CLK_IN) THEN

IF(C3=D-1) THEN C3<=\

IF(C3=D-(D+2)/2) THEN M3<=NOT M3; ELSIF (C3=D-1) THEN M3<=NOT M3; END IF; END IF; END IF; END PROCESS;

CLK_OUT <=M1 OR M2 OR M3; END BHV;

此程序原理在1、2已经说过了,这里主要用到的就是if的奇偶判断语句: D1<=CONV_STD_LOGIC_VECTOR(D,8); IF D1(0)='1' THEN 此为奇数判断;

D1<=CONV_STD_LOGIC_VECTOR(D,8); IF D1(0)='0' THEN 此为偶数判断。

从而实现了数控分频。 程序仿真:

2分频:

3分频:

4分频:

四、实验心得

此次实验我并没有按照老师的要求,在上课之前先把程序做好,对此我深

感抱歉,没有在课前写好程序是我认为自己能够在几个小时内完成,其实不然,是自己太高估了自己,没有放很多时间在EDA这门课程上,可是通过这次的实验,我深刻意识到,其实自己再也普通不过,在上课之前的一天晚上,我从10点开始编写这个数控分频程序,然而我却发现了难度,想法我是有的,可是却编写不出来。刚刚开始我是想通过时钟上下沿跳变计数来实现数控分频,因为这样能够简单的实现,可是在编程上却遇到了难度,因为对VHDL的语法规则的不熟悉,我一直熬夜到了半夜两点还是一点也没写出来,只好上床睡觉了,第二天中午还想了一中午,通过两个进程来实现计数,对同一个信号进行两个进程的奇数,一个是上升沿,一个是下降沿,再次碰壁。时间过得飞快,到了上课时间,我还是毫无收获,当老师问起我的作业时,我顿时哑口无言,深感惭愧。那三节课的时间我还是编不出任何东西,但是也熟悉了许多语法规则,例如signal要在进程外定义,begin要在定义变量之前,process之后等等小问题,曾经想过抄袭同学的回去再好好领悟,可是我放弃了,因为我知道这样做我就更加没有收获,而且也对不起自己,所以在课后我也不断的尝试去编写,刚刚开始还是不断受挫,

不知道从何写起,后来和同学讨论了一下,发现还有奇偶判断的方法,于是灵机一动,只要把任意奇数分频和任意偶数分频写出来合并在一起就可以实现数控分频了。于是我开始研究书上的5次分频程序,并且发现了任意奇偶分频的函数规律,最终终于把程序编好了。故余虽愚,卒或有所闻。通过这次的实验,我深知在EDA这个领域的编程的困难性,所以我愿意花更多的时间去学习,老师所布置的实验再也不会不提前做好程序了。

本文来源:https://www.bwwdw.com/article/wlxd.html

Top