数控分频器实验报告
EDA数控分频器

分频器实验报告一:实验目的1 更加熟悉数控分频器的原理和熟练编程。
2设计一个能够用用程序控制的分频器。
3应具备有(2~64)偶数可选分频的基本功能。
4有使能控制键。
二:实验原理数控分频器实际上就是计数器。
其功能就是在输入不同的数据时,对输入的时钟进行不同的分频,如:若输入00100000,则是4分频。
把计数累加的数值跟输入的数值相比较,来达到可控的目的。
三:实验设备EDA实验箱,电脑四:实验程序定义一个被分频时钟输入,一个分频后信号输出,8个拨码开关做输入。
定义两个进程,IF语句是关键。
程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fengpin isport( clk:in std_logic;jin:in std_logic_vector(7 downto 0);cout:out std_logic );end ;architecture one of fengpin issignal full :std_logic;beginp1:process(clk)variable cnt8 :std_logic_vector(7 downto 0); beginif clk'event and clk ='1' thenif cnt8="11111111" thencnt8:=jin;full<='1';else cnt8:=cnt8+1;full<='0' ;end if ;end if;end process p1;p2:process(full)variable cnt2:std_logic;beginif full'event and full='1' thencnt2:=not cnt2;if cnt2='1' then cout<='1';else cout<='0';end if;end if ;end process p2;end ;五:实验步骤在QUARTUS中建立工程,使用器件为EP1K30QC208,用VHDL 语言描述,综合通过后,定义引脚,生成SOF文件,下到FPGA,观察现象。
实验07数控分频器

实验七数控分频器一. 实验目的1. 学习数控分频器的设计、分析和测试方法;2. 了解蜂鸣器的发声原理二. 准备知识我们知道,分频器与计数器是基于同一原理的。
我们如果设计N进制的计数器,即其模为N,一般情况下,我们使用计数器都是从0计数到N-1,输出进位,然后复位或清零,以后一次循环。
其计数结果就是0~N-1,共N种变化,进位就是一个N次的分频器。
同样,计数结果从1~N,或从2~N+1……在最大计数值时输出进位,其进位同样也是N次分频,为了方便和其它考量,一般在这种设计时,都是把计数器的最大计数设为计数器计满时的最大值,即如果是8位的N进制计数器,计数范围为0xFF+1-N~0xFF,0xFF就是由计数器位数决定的最大计数值。
二者的区别在于:0~N-1计数方式是同一起点计数,0xFF+1-N~0xFF计数方式是同一终点计数。
在使用可变分频器的设计中,往往采用第二种方法,原因是其分频频率比较“干净”。
蜂鸣器从控制电路上分为有源和无源,有源蜂鸣器直接接上其额定电源(1.5~15V直流工作电压,和蜂鸣器本身有关),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,就可连续发声;而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能发声,即对蜂鸣器加的电压或通过的电流要是在300Hz~几KHz(听觉范围内)的方波信号,从能量的角度来说,这个方波信号最好是占空比为1:1的,这时其发声强度最大。
实验箱上的蜂鸣器是无源蜂鸣器,本实验使用按键控制分频器的输出频率,其进位输出结果接到蜂鸣器,在听觉范围内的频率,可以直观的分辨数控分频器的变化。
三. 实验步骤1、新建工程dvf新建工程文件夹shiyan7,在该文件夹中新建工程dvf。
2、新建原理图文件dvf编写模为可变参数、位宽为可变参数的通用计数分频器模块Int_Div,并封装。
(参考程序清单),要仔细看懂程序。
新建HDL数控分频器文件pluse,其进位输出经T触发器,送入蜂鸣器。
实验五 数控分频器的设计

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY PULSE IS PORT(CLK:IN STD_LOGIC; D: IN STD_LOGIC_VECTOR(7 DOWNTO 0); FOUT:OUT STD_LOGIC); END; ARCHITECTURE ONE OF PULSE IS SIGNAL FULL:STD_LOGIC; BEGIN
P_DIV:PROCESS(FULL)—由于P_REG进程数控 分频输出的FULL是脉宽极窄的脉冲波,为便于 驱动扬声器, P_DIV进程为一个二分频计数器, 使到达扬声器的波形为对称方波。 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;
实验五
数控分频器的设计
(参照实验教材P53 实验 3 中的内容)
一、实验目的
学习数控分频器的设计、分析和硬件测试
方法。
二、上用VHDL语言完成数 控分频器的设计。 2、 对所编写的源程序进行编译、综合、 适配、引脚锁定、下载测试; 3、 进行仿真测试;
2、实验内容及步骤
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;
EDA数控分频器设计的实验报告

实验报告
专业班级:电子092姓名:林明辉学号:200901122
实验课程:EDA技术实用教材
项目名称:
一.实验目的:1.了解并掌握QuartusⅡ使用方法
2.学Байду номын сангаас8位数码扫描器显示电路设计
3.实验箱的运用
实验原理:其中每个数码管的8个段:h、g、f、e、d、c、b、a(h是小数点)都分别连在一起,8个数码管分别由8个选通信号k1、k2、…k8来选择。被选通的数码管显示数据,其余关闭。如在某一时刻,k3为高电平,其余选通信号为低电平,这时仅k3对应的数码管显示来自段信号端的数据,而其它7个数码管呈现关闭状态。根据这种电路状况,如果希望在8个数码管显示希望的数据,就必须使得8个选通信号k1、k2、…k8分别被单独选通,并在此同时,在段信号输入口加上希望在该对应数码管上显示的数据,于是随着选通信号的扫变,就能实现扫描显示的目的。
二.实验步骤:1.先编好底层文件—数控分频器程序
2.编好8位数码扫描显示电路程序
3.把两个底层文件设置成符号文件
4.调用以上两个符号文件连成以下电路图
三.实验仪器:电脑一台
实验箱一个
四.数据记录及处理:
实验四 数控分频器的设计

实验四、数控分频器的设计
(1)实验目的:学习数控分频器的设计、分析和Modelsim仿真方法。
(2)实验原理:数控分频器的功能就是当在输入端给定不同输入数据时,将对输入的时钟信号有不同的分频比,参考代码中的数控分频器是用可并行预置的加法计数器设计完成的,当加法计数器溢出时进行并行预置。
(3)实验内容1:分析参考代码中的各语句功能、设计原理、逻辑功能,根据图1的波形提示,编写相应的Testbench文件代码,并用Modelsim进行仿真(仿真可以跳过时钟分频到100hz进程)。
(4)实验内容2:在此基础上进行硬件验证。
实验方法为:将clk接20Mhz 时钟信号,rst_n接核心板开关S1,fout接发光二极管SD0,预置值d从DKA0-DKA7输入,改变d的输入,从发光二极管SD0判断输出信号的频率。
(5)实验附加内容:将参考代码扩展成16位分频器,并提出此项设计的实用示例,如PWM的设计等。
(6)思考题:怎样利用2个参考代码中给出的模块设计一个电路,使其输出方波的正负脉宽的宽度分别由两个8位输入数据控制?
(7)附加题:从实验中你可以得到设计硬件电子琴的方法吗?
图1 当给出不同输入值d时,fout输出不同频率(clk周期=50ns)
参考代码。
数控分频器设计

实验六数控分频器设计一.实验目的1.设计实现一个根据不同的输入,将时钟信号进行分频2.掌握分频计数器类型模块的Verilog描述方法;3.学习设计仿真工具的使用方法;4.学习层次化设计方法;二.实验环境1.硬件环境:MagicSOPC实验箱,P4电脑;2.软件环境:QuartusⅡ软件一套。
三.实验内容1.用Verilog 语言设计带计数允许和复位输入的数控分频器。
2.编制仿真测试文件,并进行功能仿真。
3.下载并验证分频器功能四.实验原理分频就是根据输入的数字,对一段时钟周期进行分频,通过分频可以更清楚地看到输入与输出之间的关系,从而了解程序。
当用户设置好输入变量时,输出也就随之的改变。
五.实验步骤源程序:module dvf2(clk,d,fout,pfull);input clk;input[7:0]d;output fout,pfull;reg[7:0]cnt;reg pfull;reg fout;always @(posedge clk )beginif(cnt==d)begin cnt=8'd0;pfull =1;endelsebegin cnt=cnt+1;pfull=0;endendalways@(posedge pfull)fout=~fout;Endmodule1)RTL原理图2)仿真按管脚分配图分配管脚。
安装好实验箱驱动后点击图中start开始运行(图中没有安装驱动)。
六.实验心得体会本次实验初步了解了实验箱的构造,学会了实验箱与软件的连接方法,了解了软件下载到试验箱芯片上的基本流程,通过和老师的学习,同学的交流完成了本次实验。
数控分频器设计

EDA设计课程实验报告实验题目:数控分频器设计学院名称:专业:班级:姓名:高胜学号小组成员:指导教师:一、实验目的学习数控分频器的设计、分析和测试方法。
二、设计任务及要求1、设计总体要求:在SmartSOPC试验箱上的实现数控分频器的设计。
在clk输入64kHz或更高(要确保分频后落在音频范围)的频率信号(由int_div模块分频得到);输出FOUT接蜂鸣器BUZZ-ER,由KEY1/KEY2控制输入8位预置数,并在数码管1~2上显示(调用key_led模块)。
2、设计基本要求:(1)能将频率分频。
(2)进行正常的蜂鸣器的蜂鸣功能。
(3)由2个数码管显示预置数。
三、系统设计1、整体设计方案数控分频器的输出信号频率为输入数据的函数。
数控分频器的clk为时钟输入端,data是数据输入端,fout是数控频率输出端。
数控分频器的输出频率受数据data的控制,data越大,输出频率越高。
数控分频器就是用计数值可并行预置的加法计数器设计完成的,方法是将计数溢出位与预置数加载输入信号相接即可。
数控分频器是由数码管显示电路、按键控制电路、脉冲发生电路这3个基本电路组成。
数控分频器的系统框图(见图1):图1 数控分频器的系统框图2、功能模块电路设计48MHz的脉冲经过分频器分成64KHz,然后输入带数控分频电路当中,按键控制分频电路中的频率变化,数码管显示预置数,蜂鸣器响起。
(1)输入输出模块框图(见图2)图2 数控分频器的输入输出模块框图(2)算法流程图(见图3)图3数控分频器的算法流程图(3)Verilog源代码按键控制电路代码:module key_led(clock,key,led,hex,bin,seg,dig,ledin,data);input clock; //系统时钟(48MHz)input[7:0] key; //按键输入(KEY1~KEY8)output[7:0] led; //LED输出(LED1~LED8)output[15:0]hex; //4位16进制数输出(在数码管1~4显示)output[3:0]bin; //4位2进制数输出(在LED1~LED4显示)output[7:0]seg; //数码管段码输出output[7:0]dig; //数码管位码输出input[3:0]ledin; //LED显示输入(在LED5~LED8显示)input[15:0]data; //数码管显示输出(在数码管5~8显示)reg[15:0]hex_r;reg[3:0]bin_r;reg[7:0]seg_r;reg[7:0]dig_r;reg[16:0]count; //时钟分频计数器reg[7:0]dout1,dout2,dout3,buff; //消抖寄存器reg[2:0]cnt3; //数码管扫描计数器reg[3:0]disp_dat; //数码管扫描显存reg div_clk; //分频时钟,用于消抖和扫描wire[7:0]key_edge; //按键消抖输出//信号输出assign hex = hex_r;assign bin = bin_r;assign seg = seg_r;assign dig = dig_r;assign led = ~{ledin,bin_r};//时钟分频部分always @(posedge clock)beginif (count < 17'd120000)begincount <= count + 1'b1;div_clk <= 1'b0;endelsecount <= 17'd0;div_clk <= 1'b1;endend//按键消抖部分always @(posedge clock)beginif(div_clk)begindout1 <= key;dout2 <= dout1;dout3 <= dout2;endend//按键边沿检测部分always @(posedge clock)beginbuff <= dout1 | dout2 | dout3;endassign key_edge = ~(dout1 | dout2 | dout3) & buff;//4位16进制数输出部分always @(posedge clock) //按键1 beginif(key_edge[0])hex_r[15:12] <= hex_r[15:12] + 1'b1;endalways @(posedge clock) //按键2 beginif(key_edge[1])hex_r[11:8] <= hex_r[11:8] + 1'b1;always @(posedge clock) //按键3 beginif(key_edge[2])hex_r[7:4] <= hex_r[7:4] + 1'b1;endalways @(posedge clock) //按键4 beginif(key_edge[3])hex_r[3:0] <= hex_r[3:0] + 1'b1;end//4位2进制数输出部分always @(posedge clock) //按键5 beginif(key_edge[4])bin_r[0] <= ~bin_r[0];endalways @(posedge clock) //按键6 beginif(key_edge[5])bin_r[1] <= ~bin_r[1];endalways @(posedge clock) //按键7 beginif(key_edge[6])bin_r[2] <= ~bin_r[2];endalways @(posedge clock) //按键8 beginif(key_edge[7])bin_r[3] <= ~bin_r[3];//数码管扫描显示部分always @(posedge clock) //定义上升沿触发进程beginif(div_clk)cnt3 <= cnt3 + 1'b1;endalways @(posedge clock)beginif(div_clk)begincase(cnt3) //选择扫描显示数据3'd0:disp_dat = hex_r[15:12]; //第一个数码管3'd1:disp_dat = hex_r[11:8]; //第二个数码管3'd2:disp_dat = hex_r[7:4]; //第三个数码管3'd3:disp_dat = hex_r[3:0]; //第四个数码管3'd4:disp_dat = data[15:12]; //第五个数码管3'd5:disp_dat = data[11:8]; //第六个数码管3'd6:disp_dat = data[7:4]; //第七个数码管3'd7:disp_dat = data[3:0]; //第八个数码管endcasecase(cnt3) //选择数码管显示位3'd0:dig_r = 8'b01111111; //选择第一个数码管显示3'd1:dig_r = 8'b10111111; //选择第二个数码管显示3'd2:dig_r = 8'b11011111; //选择第三个数码管显示3'd3:dig_r = 8'b11101111; //选择第四个数码管显示3'd4:dig_r = 8'b11110111; //选择第五个数码管显示3'd5:dig_r = 8'b11111011; //选择第六个数码管显示3'd6:dig_r = 8'b11111101; //选择第七个数码管显示3'd7:dig_r = 8'b11111110; //选择第八个数码管显示endcaseendalways @(disp_dat)begincase(disp_dat) //七段译码4'h0:seg_r = 8'hc0; //显示04'h1:seg_r = 8'hf9; //显示14'h2:seg_r = 8'ha4; //显示24'h3:seg_r = 8'hb0; //显示34'h4:seg_r = 8'h99; //显示44'h5:seg_r = 8'h92; //显示54'h6:seg_r = 8'h82; //显示64'h7:seg_r = 8'hf8; //显示74'h8:seg_r = 8'h80; //显示84'h9:seg_r = 8'h90; //显示94'ha:seg_r = 8'h88; //显示a4'hb:seg_r = 8'h83; //显示b4'hc:seg_r = 8'hc6; //显示c4'hd:seg_r = 8'ha1; //显示d4'he:seg_r = 8'h86; //显示e4'hf:seg_r = 8'h8e; //显示f endcaseendendmodule数控分频电路代码:module pulse(clk,data,fout); //数控分频器 input clk; //时钟输入 input[7:0]data; //预置分频数reg fout_r; //输出寄存器reg[7:0] cnt8; //8位计数器reg full; //溢出标志位reg cnt2;assign fout = fout_r; //分频输出always @(posedge clk)beginif(cnt8 == 8'hff)begincnt8 <= data; //当cnt8计数计满时,输入数据Data被同步预置给计数器Cnt8 full <= 1'b1; //同时使溢出标志信号full输出为高电平endelsebegincnt8 <= cnt8 + 1'b1;//否则继续作加1计数full <= 1'b0; //且输出溢出标志信号full为低电平endendalways @(posedge full)beginif(full == 1'b1)begincnt2 = ~cnt2; //如果溢出标志信号full为高电平,D触发器输出取反if(cnt2 == 1'b1)fout_r = 1'b1;elsefout_r = 1'b0;endendendmodule四、系统调试1、仿真调试(1)仿真波形图(见图4)图4 数控分频器仿真波形(2)波形分析由波形图可以知道实验成功。
实验6 数控分频器的设计

实验6 数控分频器的设计(1)实验目的:学习数控分频器的设计、分析和测试方法。
(2)实验原理:数控分频器的功能就是当在输入端给定不同输入数据时,将对输入的时钟信号有不同的分频比,数控分频器就是用数值可并行预置的加法计数器设计完成的,方法是将计数溢出位与预置数加载输入信号相接即可,详细设计程序如例6-20所示。
【例6-20】8位数控分频器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DVF ISPORT(CLK : IN STD_LOGIC;D : IN STD_LOGIC_VECTOR(7 DOWNTO 0);FOUT : OUT STD_LOGIC);END ENTITY DVF;ARCHITECTURE one OF DVF ISSIGNAL FULL : STD_LOGIC;BEGINP_REG: PROCESS(CLK)VARIABLE CNT8 : STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINIF CLK'EVENT AND CLK = '1' THENIF CNT8 = "11111111" THENCNT8 := D; --当CNT8计数计满时,输入数据D被同步预置给计数器CNT8FULL <= '1'; --同时使溢出标志信号FULL输出为高电平ELSE CNT8 := CNT8 + 1; --否则继续作加1计数FULL <= '0'; --且输出溢出标志信号FULL为低电平END IF;END IF;END PROCESS P_REG ;P_DIV: PROCESS(FULL)VARIABLE CNT2 : STD_LOGIC;BEGINIF FULL'EVENT AND FULL = '1' THENCNT2 := NOT CNT2;--如果溢出标志信号FULL为高电平,D触发器输出取反IF CNT2 = '1' THEN FOUT <= '1';ELSE FOUT <= '0';END IF;END IF;END PROCESS P_DIV;END ARCHITECTURE one;(3)分析:根据图6-21的波形提示,分析例6-20中的各语句功能、设计原理及逻辑功能,详述进程P_REG和P_DIV的作用,并画出该程序的RTL电路图。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数控分频实验》姓名:谭国榕班级: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 ISPORT(CLK:IN STD_LOGIC;D:IN INTEGER RANGE 0 TO 255;K1,K2,K_OR:OUT STD_LOGIC);END;ARCHITECTURE BHV OF DIV1 ISSIGNAL TEMP3,TEMP4:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL M1,M2:STD_LOGIC;--SIGNAL OUT1,OUT2,OUT3:STD_LOGIC;BEGINPROCESS(CLK,TEMP3) BEGINIF RISING_EDGE(CLK) THENIF(TEMP3=D-1) THEN TEMP3<="00000000"; ELSE TEMP3<=TEMP3+1; END IF;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) BEGINIF FALLING_EDGE(CLK) THENIF(TEMP4=D-1) THEN TEMP4<="00000000"; ELSE TEMP4<=TEMP4+1; END IF;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) BEGINIF RISING_EDGE(CLK) THENIF(TEMP3=D-1) THEN TEMP3<="00000000"; ELSE TEMP3<=TEMP3+1; END IF;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) BEGINIF FALLING_EDGE(CLK) THENIF(TEMP4=D-1) THEN TEMP4<="00000000"; ELSE TEMP4<=TEMP4+1; END IF;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="100",在奇数任意分频中为输入信号减一,即D-1,而在第二个if里,5分频为C1="001",7分频为C1="010",9分频为C1="011",以此类推,则不难发现:5-4=1;7-5=2;9-6=3.。
即为程序中的TEMP4=D-(D+3)/2;而ELSIF里的C2="011"则为我程序中的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 ISPORT(CLK:IN STD_LOGIC;D:IN INTEGER RANGE 0 TO 255;K1:OUT STD_LOGIC);END;ARCHITECTURE BHV OF DIV2 ISSIGNAL TEMP3,TEMP4:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL M1:STD_LOGIC;--SIGNAL OUT1,OUT2,OUT3:STD_LOGIC;BEGINPROCESS(CLK,TEMP3) BEGINIF FALLING_EDGE(CLK) THENIF(TEMP3=D-1) THEN TEMP3<="00000000"; ELSE TEMP3<=TEMP3+1; END IF;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 ISPORT(CLK_IN:IN STD_LOGIC;D:IN INTEGER RANGE 0 TO 255;CLK_OUT:OUT STD_LOGIC);END;ARCHITECTURE BHV OF DIV ISSIGNAL C1,C2,C3,D1:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL M1,M2,M3:STD_LOGIC;BEGINPROCESS(CLK_IN,C1) BEGIND1<=CONV_STD_LOGIC_VECTOR(D,8);IF D1(0)='1' THENIF RISING_EDGE(CLK_IN) THENIF(C1=D-1) THEN C1<="00000000"; ELSE C1<=C1+1; END IF;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) BEGIND1<=CONV_STD_LOGIC_VECTOR(D,8);IF D1(0)='1' THENIF FALLING_EDGE(CLK_IN) THENIF(C2=D-1) THEN C2<="00000000"; ELSE C2<=C2+1; END IF;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) BEGIND1<=CONV_STD_LOGIC_VECTOR(D,8);IF D1(0)='0' THENIF FALLING_EDGE(CLK_IN) THENIF(C3=D-1) THEN C3<="00000000"; ELSE C3<=C3+1; END IF;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的语法规则的不熟悉,我一直熬夜到了半夜两点还是一点也没写出来,只好上床睡觉了,第二天中午还想了一中午,通过两个进程来实现计数,对同一个信号进行两个进程的奇数,一个是上升沿,一个是下降沿,再次碰壁。
时间过得飞快,到了上课时间,我还是毫无收获,当老师问起我的作业时,我顿时哑口无言,深感惭愧。