信息科学与工程学院
综合性实验报告
姓 名: 赵娅琳 学 号 10950214
班 级: 通信工程专业2010级 2班
实验项目名称: 8位16进制频率及设计
实验项目性质: 设计性 实验所属课程: 数字设计基础 实验室(中心): 现代电子实验中心 指 导 教 师 : 李 艾 星 实验完成时间: 2012 年 6 月 18 日教师评阅意见:
签名:年月日
实验成绩:
一、课题任务与要求
1、验证8位16进制频率计的程序;
2、根据8位16进制频率计的程序设计8位10进制频率计;
二、设计系统的概述
频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率,通常情况下计算每秒内待测的脉冲个数,此时闸门时间为1秒,闸门时间也可以大于或小于1秒。频率信号易于传输,抗干扰性强,可以获得较好的测量精度。
数字频率计的关键组成部分包括一个测频控制信号发生器、一个计数器和一个锁存器,另外包括脉冲发生器、姨妈驱动电路和显示电路。
工作过程:系统正常工作时,脉冲信号发生器输入1HZ的标准信号,经过测频控制信号发生器的处理,2分频后即可产生一个脉宽为1秒的时钟信号,以此作为计数闸门信号。测量信号时,将被测信号通过计数器作为时钟。当技术闸门信号高平有效时,计数器开始计数,并将计数结果送入锁存器中。设置锁存器的好处是现实的数据稳定,不会由于周期的清零信号而不断闪烁。最后将所存的数值由外部的译码器并在数码管上显示。
三、单元电路的设计与分析(重点描述自己设计部分)
1、八位十进制计数顶层模块设计
(1)、此模块是元件例化语句将各个元件(测频控制模块、十进制计数模块、测频锁存器模块)连接形成一个整体,完成最终频率计所期望的功能。
(2)、具体程序如下。
library ieee; --频率计顶层文件
library ieee;
use ieee.std_logic_11.all;
entity freqtest is --定义逻辑电路的端口
port(clk1hz,fsin:in std_logic;
dout:out std_logic_vector(31 downto 0));
end freqtest;
architecture behv of freqtest is --说明语句
component cnt10_8 --元件说明语句
port(rst,fx,ena:in std_logic;
d:out std_logic_vector(31 downto 0));
end component;
component reg32b
port(lk:in std_logic;
din:in std_logic_vector(31 downto 0);
dout:out std_logic_vector(31 downto 0));
end component;
component ftctrl
port (clkk:in std_logic;
cnt_en :out std_logic;
rst_cnt:out std_logic;
load:out std_logic);
end component;
signal tsten1:std_logic; --信号量定义说明语句
signal clr_cnt1:std_logic;
signal load1:std_logic;
signal dto1:std_logic_vector(31 downto 0);
signal carry_out1:std_logic_vector(6 downto 0);
begin --功能描述语句
u1:ftctrl port map(clkk=>clk1hz,cnt_en=>tsten1,rst_cnt=>clr_cnt1,load=>load1);
u2:reg32b port map(lk=>load1,din=>dto1,dout=>dout);u3:cnt10_8 port map(fx=>fsin,rst=>clr_cnt1,ena=>tsten1,d=>dto1);
end behv;
(3)、顶层文件的模块图
2、测频控制模块
(1)、此模块主要是由时钟输入、计数器使能、计数器清零、输出所存构成、其具体的实现是由一个1秒的输入信号脉冲计数允许的信号,1秒计数器结束后,计数值被锁入锁存器,计数器清零,为下一测频计数周期做好准备。
(2)、具体程序如下。
LIBRARY IEEE; --测频控制电路
USE IEEE.STD_LOGIC_11.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY FTCTRL IS --定义逻辑电路的端口
PORT (CLKK:IN STD_LOGIC; --1Hz
CNT_EN:OUT STD_LOGIC; --计数器时钟使能
RST_CNT:OUT STD_LOGIC; --计数器清零
Load:OUT STD_LOGIC);--输出锁存信号
END FTCTRL;
ARCHITECTURE behav OF FTCTRL IS --说明语句
SIGNAL Div2CLK:STD_LOGIC;BEGIN --功能描述语句
PROCESS(CLKK)
BEGIN
IF CLKK'EVENT AND CLKK='1' THEN --1Hz时钟2分频
Div2CLK <= NOT Div2CLK;
END IF;
END PROCESS;
PROCESS(CLKK,Div2CLK)
BEGIN
IF CLKK='0' AND Div2CLK='0' THEN RST_CNT<='1'; --产生计数器清零信号
ELSE RST_CNT <='0';
END IF;
END PROCESS;
Load <= NOT Div2CLK;
CNT_EN <= Div2CLK;
END behav;
3、十进制计数模块
(1)、此模块先设计单个十进制计数模块,再设计八位十进制计数模块,将线设计好的单个十进制计数模块用元件例化语句构成八进制计数模块,就将可以完成八位十进制计数模块的设计,这件设计的好处是,减小了程序设计的复杂度,而且层次感强。
(2)、主要涉及两个程序如下。
library ieee; --单个十进制设计
use ieee.std_logic_11.all;
use ieee.std_logic_unsigned.all;
entity cnt10 is --定义逻辑端口语句
port(rst,fx,ena:in std_logic;
cout:out std_logic;
outy:out std_logic_vector(3 downto 0));
end cnt10;
architecture behv of cnt10 isbegin --功能描述语句
process(rst,ena,fx)
variable cqi:std_logic_vector(3 downto 0);
begin
if rst='1' then cqi:=(others=>'0'); --清零端
elsif fx'event and fx='1' then
if ena='1' then
if cqi<9 then cqi:=cqi+1; cout<='0'; --使能端为高电平开始计数elsif cqi=9 then
cqi:=(others=>'0');
cout<='1'; --计数值到达9时,cqi端清零,cout输出1 end if;
elsif ena='0' then cqi:=(others=>'0');
end if;
end if;
outy<=cqi;
end process;
end behv;
library ieee; --八位十进制数模块
use ieee.std_logic_11.all;
entity cnt10_8 is
port(rst,fx,ena:in std_logic; --定义逻辑端口语句
d:out std_logic_vector(31 downto 0));
end cnt10_8;
architecture behv of cnt10_8 is --说明语句
component cnt10 --元件说明语句
port(rst,fx,ena:in std_logic;
cout:out std_logic;
outy:out std_logic_vector(3 downto 0));
end component;
signal e:std_logic_vector(7 downto 0); --信号量定义说明语句begin --功能描述语句
u1:cnt10 port map(fx=>fx,rst=>rst,ena=>ena,cout=>e(0),outy=>d(3 downto 0));
u2:cnt10 port map(fx=>e(0),rst=>rst,ena=>ena,cout=>e(1),outy=>d(7 downto 4));
u3:cnt10 port map(fx=>e(1),rst=>rst,ena=>ena,cout=>e(2),outy=>d(11 downto 8));
u4:cnt10 port map(fx=>e(2),rst=>rst,ena=>ena,cout=>e(3),outy=>d(15 downto 12));
u5:cnt10 port map(fx=>e(3),rst=>rst,ena=>ena,cout=>e(4),outy=>d(19 downto 16));
u6:cnt10 port map(fx=>e(4),rst=>rst,ena=>ena,cout=>e(5),outy=>d(23 downto 20));
u7:cnt10 port map(fx=>e(5),rst=>rst,ena=>ena,cout=>e(6),outy=>d(27 downto 24));
u8:cnt10 port map(fx=>e(6),rst=>rst,ena=>ena,cout=>e(7),outy=>d(31 downto 28));
end behv;
4、测频锁存器模块
(1)在频率计的设计当中设计了一个锁存器,设置锁存器的好处就是使数据显示稳定,不会由于周期周期性的清零而使信号不断的闪烁,这个模块的功能就是讲计数器在规定时间的计数值锁存进锁存器中。
(2)、具体设计程序如下、
LIBRARY IEEE; --32位锁存器
USE IEEE.STD_LOGIC_11.ALL;
ENTITY REG32B IS
PORT (LK : IN STD_LOGIC; --定义逻辑电路的端口语句
DIN : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
DOUT : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END REG32B;ARCHITECTURE behav OF REG32B IS --说明语句
BEGIN --功能描述语句
PROCESS(LK,DIN)
BEGIN
IF LK'EVENT AND LK ='1' THEN DOUT <= DIN;--使能端为高电平,输出din
END IF;
END PROCESS;
END behav;
5、八位十六进制频率计顶层模块设计
(1)、此模块是元件例化语句将各个元件(测频控制模块、十进制计数模块、测频锁存器模块)连接形成一个整体,完成最终频率计所期望的功能。
(2)、具体程序如下。
library ieee; --频率计顶层文件
library ieee;
use ieee.std_logic_11.all;
entity freqtest is
port(clk1hz,fsin:in std_logic; --定义逻辑端口语句
dout:out std_logic_vector(31 downto 0));
end freqtest;
architecture struc of freqtest is --说明语句
component FTCTRL --元件说明语句
port(clkk:in std_logic;
cnt_en,rst_cnt,load:out std_logic);
end component;
component COUNTER32B
port(fin,clr,enabl:in std_logic;
dout:out std_logic_vector(31 downto 0));
end component;component REG32B
port (lk:in std_logic;
din :in std_logic_vector(31 downto 0);
dout:out std_logic_vector(31 downto 0));
end component;
signal tsten1:std_logic; --信号量定义语句
signal clr_cnt1:std_logic;
signal load1:std_logic;
signal dto1:std_logic_vector(31 downto 0);
signal carry_out1:std_logic_vector(6 downto 0);
begin --功能描述语句
u1:ftctrl port map(clkk=>clk1hz,cnt_en=>tsten1,rst_cnt=>clr_cnt1,load=>load1);
u2:reg32b port map(lk=>load1,din=>dto1,dout=>dout);
u3:counter32b port map(fin=>fsin,clr=>clr_cnt1,enabl=>tsten1,dout=>dto1);
end struc;
6、32位计数器模块
(1)此模块主要由信号输入、清零端、使能端,信号输出端构成。
(2)具体程序如下。
LIBRARY IEEE; --32位计数器
USE IEEE.STD_LOGIC_11.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNTER32B IS
PORT (FIN : IN STD_LOGIC; --时钟信号
CLR : IN STD_LOGIC; --清零信号
ENABL : IN STD_LOGIC; --计数使能信号
DOUT : OUT STD_LOGIC_VECTOR(31 DOWNTO 0)); --计数结果END COUNTER32B;
ARCHITECTURE behav OF COUNTER32B IS
SIGNAL CQI : STD_LOGIC_VECTOR(31 DOWNTO 0);
BEGIN
PROCESS(FIN,CLR,ENABL)
BEGIN
IF CLR='1' THEN CQI <=(OTHERS=>'0'); --清零
ELSIF FIN'EVENT AND FIN ='1' THEN
IF ENABL ='1' THEN CQI <=CQI+1;
END IF;
END IF;
END PROCESS;
DOUT <=CQI;
END behav;
四、电路的仿真、结果及分析
将程序下载ACEX1K系列芯片中,同时在EDA试验箱上进行硬件验证。进行程序波形仿真,直到仿真正确无误后,则可以将程序下载到硬件调试。:频率测量的基本原理是计算每秒待测周期信号的脉冲个数。这就要求测频控制电路FTCTRl能产生一个一秒脉宽的周期信号。当FTCTRL的输出cnt_en为即cnt10_8或counter32的使能端高电平,允许计数;为低电平时停止计数,并锁入锁存器reg32b中保持所计脉冲数。锁存器使能端lk得到一个高电平将所计脉冲数输出到外部译码器中,翻译后在数码管中显示。
八位十进制频率计波形图:(clk1hz=1MHZ,fsin=10MHZ)
八位十六进制频率计的波形图:(clk1hz=2MHZ,fsin=10MHZ)
五、硬件调试及结果
仿真波形正确,便可进行下载,选择ACEX1K系列的EP1K30TC芯片,先进行引脚绑定,具体引脚绑定如下图,实验电路建议选择模式5,然后下载EDA实验箱。
在实验箱上进行硬件测试,clk1hz为基准频率输入端,fsin为待测频率输入端,下载成功之后就可以测试和操作。数码管上面显示的八位十进制数或八位十六进制数就是实际测试的信号的频率。通过与已知频率值对比,结果表明频率计能准确地测出输入信号的频率并正确表示,达到预期目的。
六、设计体会
经过这次数字设计基础实验,我个人都得到了不少的收获,一方面加深了我对理论知识的认识,另一方面也提高了实验操作能力。现在我总结了以下体会和经验。
这次的综合性实验,个人觉得跟以往的小实验差不多,自己单独设计的部分只是一个八位十进制计数模块,其他的都可以照用实验书上的程序。不过可能因为这次实验要事先自己在课下完全理解与掌握,其次所涉及的程序与元件模块比较多,所以这次实验给我留下的印象最深刻。实验就是要自己事先去弄懂实验的原理与程序设计的思路,对每个实验都要有自己的想法与理解,要不实验就成验证程序是否能完成相应的功能的简单机械性的过程了,便失去了实验原应该有的意义。通过这次频率计的设计实验,我对频率计也有了初步的了解。知道了频率计是计算机、通讯设备、音频设音频视频等科研生产领域不可缺少的测量仪器。本次实验设计以EDA工具作为开发手段,运用VHDL语言,将整个系统大大简化,提高整体的性能和可靠性。其中频率计顶层模块设计除了可以用元件例化语句,还可以用quartus将高级别的模型转化成为门及模型。同时也可以将该频率计的功能扩大,不止测量脉冲信号,还可以测量三角波等其他波形的频率,可以添加一个元件将其他波形转换为脉冲信号。
实验过程中,我们应该尽量减少操作的盲目性提高实验效率的保证。有的人一开始就赶着做,结果却越做越忙,导致一个简单的实验都会错漏百出,很久都做不好。我就是经常犯这种错误,实验的时候,很多细节性的问题都注意不到,程序标识符输错、芯片没有事先选好就直接开始绑定引脚等等,最后事倍功半。解决这些问题的关键就是要培养自己冷静分析问题,和解决问题的能力。培养这种能力的前提是自己对待每次实验的态度。如果在实验这方面很随便,抱着等老师教,拿同学的报告抄,尽管最后的成绩可能会比较高,可这只却是个潜在的恶性循环,对以后的学习工作没有丝毫好处。必须自己学会思考,不断提升能力。
最后,通过这半学期的实验我不但掌握了quartus这个软件,同时对VHDL语言有了更深刻的理解,提高了实际的操作的动手能力与思维能力。
七、参考文献
潘松,黄继业.EDA技术与VHDL(第二版)[M].北京.清华大学出版社.2007