第一篇:数字频率计实验报告
数字电路与系统课程设计
大连理工大学城市学院
数字电路与系统课程设计
设计题目:数字频率计
学 院:电子与自动化学院 专 业: 自动化 学 生: 揣智涵 同 组 人: 王晓宁 周英茹 指导教师: 于海霞 完成日期: 2012年3月26日
数字电路与系统课程设计
目 录
第一章 设计任务
1.1项目名称 1.2项目设计说明 1.2.1设计任务和要求 1.2.2进度安排 1.3项目总体功能模块图
第二章 需求分析
2.1问题基本描述
(要求分析得出整个系统流程图)2.2系统模块分解及各模块功能的基本要求
第三章 设计原理
3.1 设计原理 3.2 MAXPLUSII介绍
第四章 系统功能模块设计
4.1 FEN模块
4.1.1 FEN模块流程图
4.1.2 输入输出引脚及其功能说明 4.1.3 程序代码实现 4.2 SEL模块
4.2.1 SEL模块流程图
4.2.2输入输出引脚及其功能说明 4.2.3程序代码实现
数字电路与系统课程设计
4.3 CORNA模块
4.3.1 CORNA模块流程图
4.3.2 输入输出引脚及其功能说明 4.3.3 程序代码实现 4.4 LOCK模块
4.4.1 LOCK模块流程图
4.4.2 输入输出引脚及其功能说明 4.4.3 程序代码实现 4.5 CH模块
4.5.1 输入输出引脚及其功能说明 4.5.2 程序代码实现 4.6 DISP模块
4.6.1 输入输出引脚及其功能说明 4.6.2 程序代码实现
第五章调试并分析结果
5.1输入说明 5.2预计输出 5.3测试结果记录 5.4测试结果分析
第六章 结论 心得体会 参考文献
数字电路与系统课程设计
第一章 设计任务
1.1 项目名称:数字频率计 1.2 项目设计说明
1.2.1 设计任务和要求 此频率计共分4档: 一档:0~9999Hz;二档:10~99.99kHZ;三档:100.0~999.9kHz;,四档:1.000~999MHz;在换挡的设计方面,此程序突破了以往改变闸门时间的方法,使自动换挡的实现更加简单可靠。1.2.2 进度安排
第一节课:画出模块及程序流程图
第二节课:调试各模块程序使其无误
第三节课:连接整个程序并下载到试验箱是数字频率计的功能实现
第四节课:改进程序设计实现创新,然后完成课程设计报告
第五节课:完成答辩 1.3 项目总体功能模块图如下
数字电路与系统课程设计
图1-1
数字电路与系统课程设计
第二章 需求分析
2.1 问题基本描述
所谓频率,就是周期信号在单位时间(1秒)内变化的次数。频率计的测量范围为1MHZ,为了测量精确量程分别为10KHZ,100KHZ,1000KHZ和1MHZ四个档。即最大读数分别为9.999KHZ,99.99KHZ,999.9KHZ,999MHZ。要求两成自动换挡。其具体功能如下:
(1)当量程超过999时,自动增大一档,下一次测量时量程大一档;
(2)当超过测量范围时,显示溢出,报警器报警。(3)小数点位置随量程变化自动移位。
(4)采用记忆显示方法,在测量过程中不显示数据,在测量完成以后显示测频结果,并将此结果 保存到下次测量结束,显示时间不少于1秒。
(5)根据频率计的测频原理,可以选择合适的时基信号即阀门时间,对输入信号脉冲进行计数,实现测频的目的。
(6)根据数字频率计的设计原理,可以将数字频率计设计分为五个模块来实现其功能。即分频模块,控制模块,计数模块,锁存模块和显示模块。用CLDH语言进行编程。
(7)弄清什么情况下是测频率,就是选择合适的时基信号的问题。测频率时以输入信号作为时钟信号,因为输入信号的频率大于频率计的基准频率。:
数字电路与系统课程设计
数字频率计的系统流程图如下
图2-1
数字电路与系统课程设计
2.2 系统模块分解及各模块功能的基本要求
计数器在各个档是被反复应用的,如果在各个档分别设计计数器就造成资源的浪费,而且在测周期和频率的时候,计数器的时基信号和输入信号要进行调换,但计数功能是一样的,所以将计数器设为单独的模块。七段译码器也是被重复使用的,也设成单独的模块,这样的话就不用在重复使用的时候重复书写译码电路了。总体来说数字频率计分为五个模块来设计,即分频模块计数 模块,锁存模块,预测控制信号发生器,显示模块。
分频模块为计数模块提供1秒的阀门时间。计数模块是整个程序的核心,它完成在1秒的时间里对被测信号计数的功能,并通过选择输出数据实现自动换挡的功能。锁存模块在信号L的下降沿到来时将信号A4,A3,A2,A1锁存。显示模块对应于数码管片选信号,将相应的数据送出,其中档位也通过数码管显示。
数字电路与系统课程设计
第三章 设计原理
3.1 设计原理
众所周知,频率信号易于传输,抗干扰性强,可以获得较好的测量精度。因此,频率检测是电子测量领域最基本的测量之一。频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。通常情况下计算每秒内待测信号的脉冲个数,即闸门时间为1 s。闸门时间可以根据需要取值,大于或小于1 s都可以。闸门时间越长,得到的频率值就越准确,但闸门时间越长,则每测一次频率的间隔就越长。闸门时间越短,测得的频率值刷新就越快,但测得的频率精度就受影响。一般取1 s作为闸门时间。
数字频率计的关键组成部分包括测频控制信号发生器、计数器、锁存器、译码驱动电路和显示电路,其原理框图如图3-1所示。
图3-1数字频率计原理图
3.2 MAXPLUSII介绍
MAX+PLUSⅡ(Multiple Array and Programming Logic User System)开发工具是Altera公司推出的一种EDA工具,具有灵活高效、使用便捷和易学易用等特点。Altera公司在推出各种CPLD的同时,也在不断地升级相应的开发工具软件,已从早起的第一代A+PLUS、第二代MAX+PLUS发展到第三代MAX+PLUSⅡ和第四代
数字电路与系统课程设计
Quartus。使用MAX+PLUSⅡ软件,设计者无需精通器件内部的复杂结构,只需用业已熟悉的设计输入工具,如硬件描述语言、原理图等进行输入即可,MAX+PLUSⅡ就会自动将设计转换成目标文件下载到器件中去。MAX+PLUSⅡ开发系统具有以下特点。(1)多平台。MAX+PLUSⅡ软件可以在基于PC机的操作系统如Windows95、Windows98、Windows2000、Windows NT下运行,也可以在Sun SPAC station等工作站上运行。
(2)开放的界面。MAX+PLUSⅡ提供了与其他设计输入、综合和校验工具的接口,借口符合EDIF 200/300、LPM、VHDL、Verilog-HDL等标准。目前MAX+PLUSⅡ所支持的主流第三方EDA工具主要有Synopsys、Viewlogic、Mentor、Graphics、Cadence、OrCAD、Xilinx等公司提供的工具。
(3)模块组合式工具软件。MAX+PLUSⅡ具有一个完整的可编程逻辑设计环境,包括设计输入、设计处理、设计校验和下载编程4个模块,设计者可以按设计流程选择工作模块。(4)与结构无关。MAX+PLUSⅡ开发系统的核心——Compiler(编译器)能够自动完成逻辑综合和优化,它支持Altera的Classic、MAX7000、FLEX8000和FLEX10K等可编程器件系列,提供一个与结构无关的PLD开发环境。
(5)支持硬件描述语言。MAX+PLUSⅡ支持各种HDL设计输入语言,包括VHDL、Verilog-HDL和Altera的硬件描述语言AHDL。(6)丰富的设计库。MAX+PLUSⅡ提供丰富的库单元供设计者调用,其中包括一些基本的逻辑单元,74系列的器件和多种特定功能的宏功能模块以及参数化的兆功能模块。调用库单元进行设计,可以大大减轻设计人员的工作量,缩短设计周期。
数字电路与系统课程设计
第四章 系统功能模块
4.1 FEN 模块
4.1.1 FEN 模块流程图
图4-1
数字电路与系统课程设计
4.1.2输入输出引脚及其功能说明
模块FEN如图9-87所示。通过对4MHz时钟的分频得到0.5Hz时钟,为模块CORNA提供1s的闸门时间。CLK:输入时钟信号;Q:输出分频后的基准信号。程序代码的实现如下
library ieee;use ieee.std_logic_1164.all;entity fen is
port(clk:in std_logic;
q: out std_logic);
end fen;architecture fen_arc of fen is begin process(clk)variable cnt: integer range 0 to 999999;variable x: std_logic;begin
if clk'event and clk = '1' then
if cnt<999999 then
cnt:=cnt+1;
else
cnt:=0;
x:= not x;
end if;
end if;
q<=x;end process;end fen_arc;
图4-2
数字电路与系统课程设计
4.2 SEL模块
4.2.1 SEL 模块流程图
图4-3 4.2.2 SEL模块输入输出引脚及其功能说明
CLK:基准时钟信号; Q[2..0]:产生数码管的片选信号。4.2.3 程序代码实现
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity sel is port(clk: in std_logic;
图4-4 q:out std_logic_vector(2 downto 0));
end sel;
数字电路与系统课程设计
architecture sel_arc of sel is begin process(clk)variable cnt:std_logic_vector(2 downto 0);begin
if clk'event and clk='1' then
cnt:=cnt+1;
end if;
q<=cnt;end process;end sel_arc;4.3 模块CORNA 4.3.1 CORNA 模块流程图
图4-5 14
数字电路与系统课程设计
4.3.2 输入输出引脚及其功能说明
该模块是整个程序的核心,它完成在1s的时间里对被测信号计数的功能,并通过选择输出数据实现自动换挡的功能输入输出引脚及其功能说明CLR:复位按钮;SIG:待测频率信号;DOOR:基准时钟频率;ALM:蜂鸣器;DANG[3..0]:档位值;Q0~4[3..0]:计算后的频率值。4.3.3程序代码实现
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity corna is port(clr,sig,door : in std_logic;
alm : out std_logic;
q3,q2,q1,q0,dang : out std_logic_vector(3 downto 0));end corna;
architecture corn_arc of corna is begin process(door,sig)variable c0,c1,c2,c3,c4,c5,c6: std_logic_vector(3 downto 0);variable x:std_logic;
begin
if sig'event and sig='1' then
if door='1' then
if c0<“1001”then
c0:=c0+1;
else
c0:=“0000”;
if c1<“1001” then
c1:=c1+1;
else
c1:=“0000”;
图4-6
数字电路与系统课程设计
if c2<“1001” then
c2:=c2+1;
else
c2:=“0000”;
if c3<“1001” then
c3:=c3+1;
else
end if;
end if;
end if;
end if;end if;end if;end if;else if clr = '0' then
alm <= '0';end if;c6:=“0000”;c5:=“0000”;c4:=“0000”;c3:=“0000”;c2:=“0000”;
c3:=“0000”;if c4<“1001” then c4:=c4+1;else c4:=“0000”;if c5<“1001” then
c5:=c5+1;else
c5:=“0000”;if c6<“1001” then
c6:=c6+1;else
c6:=“0000”;
alm<='1';
数字电路与系统课程设计
c1:=“0000”;c0:=“0000”;end if;if c6/=“0000” then q3<=c6;q2<=c5;q1<=c4;q0<=c3;dang<=“0100”;elsif c5/=“0000” then q3<=c5;q2<=c4;q1<=c3;q0<=c2;dang<=“0011”;elsif c4/=“0000” then q3<=c4;q2<=c3;q1<=c2;q0<=c1;dang<=“0010”;else q3<=c3;q2<=c2;q1<=c1;q0<=c0;dang<=“0001”;end if;end if;end process;end corn_arc;
数字电路与系统课程设计
4.4 模块LOCK 4.4.1 LOCK 模块流程图
图4-7 4.4.2 输入输出引脚及其功能说明
该模块实现锁存器的功能,在信号L的下降沿到来时信号A4、A3、A2、A1锁存。输入输出引脚及其功能说明L:基准时钟信号;A0~4[3..0]:接受计数器CORNA传过来的值并锁存;Q0~4[3..0]:向数据选择器传值。4.4.3 程序代码实现
library ieee;use ieee.std_logic_1164.all;entity lock is
数字电路与系统课程设计
port(l: in std_logic;
a4,a3,a2,a1,a0:in std_logic_vector(3 downto 0);
q4,q3,q2,q1,q0:out std_logic_vector(3 downto 0));end lock;architecture lock_arc of lock is begin process(l)variable t4,t3,t2,t1,t0:std_logic_vector(3 downto 0);begin
if l'event and l='0' then
t4:=a4;
t3:=a3;
t2:=a2;
t1:=a1;
t0:=a0;
end if;
q4<=t4;
q3<=t3;
q2<=t2;
q1<=t1;
q0<=t0;end process;
图4-8 end lock_arc;4.5 模块CH
4.5.1 输入输出引脚及其功能说明
该模块对应于数码管片选信号,将相应的数据送出,其中档位也通过数码管显示。输入输出引脚及其功能说明SEL[2..0]:接受SEL模块传来的数码管片选信号;A[3..0]:接受锁存器传来的数码管片选信号;DANG[3..0]:接受锁存器传来的档位信号;Q[3..0]:传出数码管位选信号。4.5.2 程序代码实现
library ieee;
数字电路与系统课程设计
use ieee.std_logic_1164.all;entity ch is port(sel:in std_logic_vector(2 downto 0);
a3,a2,a1,a0,dang:in std_logic_vector(3 downto 0);
q:out std_logic_vector(3 downto 0));end ch;
architecture ch_arc of ch is begin process(sel)begin
case sel is
when “110” =>q<=a0;
when “010” =>q<=a1;when “100” =>q<=a2;
图4-9
when “000” =>q<=a3;
when “101” =>q<=dang;
when others =>q<= “1111”;end case;end process;end ch_arc;4.6 DISP模块
4.6.1输入输出引脚及其功能说明
D[3..0]:接受CH传出的数码管位选信号;Q[6..0]:译码出数码管位选信号; 4.6.2程序代码实现
use ieee.std_logic_1164.all;entity disp is port(d:in std_logic_vector(3 downto 0);
q:out std_logic_vector(6 downto 0));
图4-10 end disp;
数字电路与系统课程设计
architecture disp_arc of disp is
begin process(d)begin
case d is
when “0000” =>q<=“0111111”;
when “0001” =>q<=“0000110”;
when “0010” =>q<=“1011011”;
when “0011” =>q<=“1001111”;
when “0100” =>q<=“1100110”;
when “0101” =>q<=“1101101”;
when “0110” =>q<=“1111101”;
when “0111” =>q<=“0100111”;
when “1000” =>q<=“1111111”;
when “1001” =>q<=“1101111”;
when others =>q<=“0000000”;
end case;end process;end disp_arc;
数字电路与系统课程设计
第五章
5.1输入说明
调试并分析结果
SIG:接1KHz频率;CLR:接开关;CLK:接4MHz频率。
5.2预计输出
低两位数码管显示‘1’;高四位数码管显示‘1000’。
5.3 测试结果记录
低两位数码管显示‘1’;高四位数码管显示‘1000’。
5.4 测试结果分析
本频率计满足试验要求,使用周期和直接测量法进行测量,这样会减小误差。实验中也遇到了很多问题,在器件在线编程过程中,program各项操作无法进行,如果是首次编程,则需要设置下载端口,如果还比能进行操作,可能是芯片或者试验箱出现问题,所以应该换芯片或试验箱。在连接引脚是要特别注意,否则显示管无法显示。此外此试验还有需要改进的地方,比如测量频率的精度和灵敏度。
待测信号给的是1KHz,数码管档位显示为一档(0~9999Hz);频率显示为‘1000’;与预计输出完全一样。因为基准信号和待测信号是同一个信号源,故如此准确。也论证了上述设计的正确性。
数字电路与系统课程设计
图5-1 如上图,待测信号sig 10KHz,clk接1MHz显示如图,第一行和第二行为脉冲频率,第三行为档位,10KHz的待测信号档位为二档。
数字电路与系统课程设计
第六章 结论
心得体会
经过这次的实验课程设计,我学到了如何将多个程序绑在一起使用并构成一个完整的系统。在老师的指导下、在我们实验设计小组的共同努力下、在其他同学的热情帮助下,我们完整滴完成了《数字频率计》的设计、组装,并做了些创新。
虽然实验成功,我们同样在实验过程中遇到了一些问题: 1.刚开始时候的设计是每组组员做一部分,但是问题就是有些系数不能同一。因此造成了一开始实验进展缓慢。2.在实验过程中,器材的问题也被我们遇到了。因此也得到了些经验:要对自己的实验成果由信心,不要一出问题就从程序中找问题。可能对你最大的阻碍就是你没有考虑到的器材问题。
3.在最后仿真时候,导线的顺序也是常出问题的地方。由于没有及时发现问题的所在,我们小组花费了整整一节课的时间在改程序,浪费了许多宝贵时间。
参考文献
【1】VHDL数字电路设计与应用与实践教程 【2】第2版王振红 主编机械工业出版社
数字电路与系统课程设计
第二篇:数字频率计
//*********************************************************************
//* 标题: 简易数字频率计 //* 文件: topdesign.v
//* 作者: SJ&QJY
//* 日期: 2009.06.10 //* 修改: 2009.12.20
//* 软件: Xilinx ISE 7.1 SP4
//* 芯片: Xilinx Spartan2 FPGA(XC2S200-pq208)
//* 说明: 测频率并用LCD显示,从信号源接入一个信号(正弦波,三角波或者方波),经过AD1转换后,送入FPGA中。
//在FPGA中,使用双值法整形,得到标准的方波,然后测出频率,并送入1602中显示。经测试,其测频误差小于0.5%,其测频范围为10Hz-10MHz。
//********************************************************************* //* 注意: 输入信号电压峰峰值不要超过AD输入范围,即4V。
//*********************************************************************
//---------------module topdesign(clk, rst, lcd_rs, lcd_rw, lcd_en, lcd_d, ad1_clk, ad1_d);
input clk;
//时钟信号40MHz input rst;
//全局复位信号
output lcd_rs;//LCD数据/命令选择信号,'1'表示数据输入,'0'表示命令输入
output lcd_rw;
//LCD读/写信号,'1'表示读,'0'表示写
output reg lcd_en;
//LCD使能信号,'1'有效
output[7:0] lcd_d;
//LCD数据总线(8位)
output ad1_clk;
//AD时钟信号
input[11:0] ad1_d;
//AD9224,12位AD输入
//LCD时序常量信号
parameter[10:0] IDLE = 11'b00000000000;
//初始化
parameter[10:0] CLEAR = 11'b00000000001;
//清屏
parameter[10:0] RETURNCURSOR = 11'b00000000010;//归位
parameter[10:0] SETMODE = 11'b00000000100;
//设置输入模式。此状态为完成一个字符码传送后,AC自动减1,显示不发生移位
parameter[10:0] SWITCHMODE = 11'b00000001000;//显示开关控制
parameter[10:0] SHIFT = 11'b00000010000;//光标或显示移位
parameter[10:0] SETFUNCTION = 11'b00000100000;//功能设置:数据总线选8位还是4位
parameter[10:0] SETCGRAM = 11'b00001000000;//CGRAM的地址设置
parameter[10:0] SETDDRAM = 11'b00010000000;
//DDRAM地址设置
parameter[10:0] READFLAG = 11'b00100000000;//读忙标志BF和AC
parameter[10:0] WRITERAM = 11'b01000000000;
//写数据到CGRAM或DDRAM
parameter[10:0] READRAM = 11'b10000000000;
parameter cur_inc = 1'b1;
parameter cur_dec = 1'b0;
parameter cur_shift = 1'b1;
parameter cur_noshift = 1'b0;
parameter open_display = 1'b1;
parameter open_cur = 1'b0;
parameter blank_cur = 1'b0;
parameter shift_display = 1'b1;
parameter shift_cur = 1'b0;
parameter right_shift = 1'b1;
parameter left_shift = 1'b0;
parameter datawidth8 = 1'b1;
parameter datawidth4 = 1'b0;
parameter twoline = 1'b1;
parameter oneline = 1'b0;
parameter font5x10 = 1'b1;
parameter font5x7 = 1'b0;
reg[10:0] state;
//时序信号
reg[5:0] counter;
reg[3:0] div_counter;
reg flag;
//辅助时序信号
parameter DIVSS = 4'd15;
reg[5:0] char_addr;
reg[7:0] data_in;
//延迟参量信号
reg clk_int;
reg[19:0] clkcnt;
parameter[19:0] divcnt = 20'b***00000;
reg clkdiv;
wire tc_clkcnt;
//测频部分
parameter[15:0] ad_d_chankao1 = 16'b***1;
parameter[15:0] ad_d_chankao2 = 16'b***1;
reg[15:0] ad1_d_r;
//计数部分
reg[25:0] yimiao;
//用来计数
reg rukou;
//整形方波
reg[3:0] odata7;
//记录数据
reg[3:0] odata6;
reg[3:0] odata5;
reg[3:0] odata4;
reg[3:0] odata3;
reg[3:0] odata2;
//将近-25mV //将近25mV
reg[3:0] odata1;
reg[3:0] odata0;
reg[7:0] data7;
reg[7:0] data6;
reg[7:0] data5;
reg[7:0] data4;
reg[7:0] data3;
reg[7:0] data2;
reg[7:0] data1;
reg[7:0] data0;
reg yimiao_rst;
//将记录的数据转换成ASCII码,以便显示
//数据清零信号
//主程序
assign ad1_clk = clk;
always @(posedge clk)
begin
yimiao_rst =(yimiao == 26'b***00111111111)? 1'b0 : 1'b1;//一秒时清零信号有效
end //测频部分
always @(posedge clk)
begin
ad1_d_r <= {ad1_d, 4'b0000};
if(ad1_d_r > ad_d_chankao2)
rukou <= 1'b1;
if(ad1_d_r < ad_d_chankao1)
rukou <= 1'b0;
end //1秒钟测频
always @(posedge clk)
//每1秒钟循环一次
begin
if(yimiao == 26'b***01000000000)
yimiao <= 26'b***00000000000;
else
yimiao <= yimiao + 1;
end
//计数部分
always @(posedge rukou or negedge yimiao_rst)
if(~yimiao_rst)
begin
odata0 <= 4'b0000;
odata1 <= 4'b0000;
odata2 <= 4'b0000;
odata3 <= 4'b0000;
odata4 <= 4'b0000;
odata5 <= 4'b0000;
odata6 <= 4'b0000;
odata7 <= 4'b0000;
end
else if(yimiao < 26'b***00111111111)
begin
begin
if(odata0 == 4'b1001)
begin
odata0 <= 4'b0000;
if(odata1 == 4'b1001)
begin
odata1 <= 4'b0000;
if(odata2 == 4'b1001)
begin
odata2 <= 4'b0000;
if(odata3 == 4'b1001)
begin
odata3 <= 4'b0000;
if(odata4 == 4'b1001)
begin
odata4 <= 4'b0000;
if(odata5 == 4'b1001)
begin
odata5 <= 4'b0000;
if(odata6 == 4'b1001)
begin
odata6 <= 4'b0000;
if(odata7 == 4'b1001)
begin
odata7 <= 4'b0000;
end
else
begin
odata7 <= odata7 + 1;
end
end
else
begin
odata6 <= odata6 + 1;
end
end
else
begin
odata5 <= odata5 + 1;
end
end
else
begin
odata4 <= odata4 + 1;
end
end
else
begin
odata3 <= odata3 + 1;
end
end
else
begin
odata2 <= odata2 + 1;
end
end
else
begin
odata1 <= odata1 + 1;
end
end
else
begin
odata0 <= odata0 + 1;
end
end
end
//码制转换
always @(posedge clk)
begin
if(yimiao == 26'b***00111110110)
begin
data7 <= {4'b0011, odata7};
//将二进制BCD码转换成ASCII码,即1602可以显示的码值
data6 <= {4'b0011, odata6};
data5 <= {4'b0011, odata5};
data4 <= {4'b0011, odata4};
data3 <= {4'b0011, odata3};
data2 <= {4'b0011, odata2};
data1 <= {4'b0011, odata1};
data0 <= {4'b0011, odata0};
end
end
//时钟分频
always @(posedge clk)
begin
if(clkcnt == divcnt)
begin
clkcnt <= 20'b***00000;
end
else
begin
clkcnt <= clkcnt + 1;
end
end
assign tc_clkcnt =(clkcnt == divcnt)? 1'b1 : 1'b0;//tc_clkcnt 0.016s产生一次脉冲
always @(posedge tc_clkcnt)
begin
clkdiv <= ~clkdiv;
0.032s
end
always @(posedge clkdiv)
begin
clk_int <= ~clk_int;
end
//显示界面设置
always @(negedge clkdiv)
begin
lcd_en <= ~lcd_en;
end
always @(char_addr)
begin
case(char_addr)
6'b000000 : //I
//clkdiv 0.016s翻转一次,周期为
//clk_int 0.032s翻转一次,周期为0.064s
begin
data_in <= 8'b01001001;
end
6'b000001 ://n
begin
data_in <= 8'b01101110;
end
6'b000010 : //p
begin
data_in <= 8'b01110000;
end
6'b000011 :
//u
begin
data_in <= 8'b01110101;
end
6'b000100 :
//t
begin
data_in <= 8'b01110100;
end
6'b000101 : //空格
begin
data_in <= 8'b00100000;
end
6'b000110 :
//F
begin
data_in <= 8'b01100110;
end
6'b000111 :
//r
begin
data_in <= 8'b01110010;
end
6'b001000 :
//e
begin
data_in <= 8'b01100101;
end
6'b001001 :
//q
begin
data_in <= 8'b01110001;
end
6'b001010 :
//u
begin
data_in <= 8'b01110101;
end
6'b001011 : //e
begin
data_in <= 8'b01100101;
end
6'b001100 : //n
begin
data_in <= 8'b01101110;
end
6'b001101 : //c
begin
data_in <= 8'b01100011;
end
6'b001110 : //y
begin
data_in <= 8'b01111001;
end
6'b001111 :
//空格
begin
data_in <= 8'b00100000;
end
6'b101000 :
//“=”
begin
data_in <= 8'b00111101;
end
6'b101001 :
//若为零则显示空格
begin
if(data7 == 8'b00110000)
begin
data_in <= 8'b00100000;
end
else
begin
data_in <= data7;
end
end
6'b101010 : //若为零则显示空格
begin
data_in <= data6;
if(data6 == 8'b00110000 & data7 == 8'b00110000)
begin
data_in <= 8'b00100000;
end
else
begin
data_in <= data6;
end
end
6'b101011 :
//若为零则显示空格
begin
data_in <= data5;
if(data5 == 8'b00110000 & data6 == 8'b00110000 & data7 == 8'b00110000)
begin
data_in <= 8'b00100000;
end
else
begin
data_in <= data5;
end
end
6'b101100 : //若为零则显示空格
begin
data_in <= data4;
if(data4 == 8'b00110000 & data5 == 8'b00110000 & data6 == 8'b00110000 & data7 == 8'b00110000)
begin
data_in <= 8'b00100000;
end
else
begin
data_in <= data4;
end
end
6'b101101 :
//若为零则显示空格
begin
data_in <= data3;
if(data3 == 8'b00110000 & data4 == 8'b00110000 & data5 == 8'b00110000 & data6 == 8'b00110000 & data7 == 8'b00110000)
begin
data_in <= 8'b00100000;
end
else
begin
data_in <= data3;
end
end
6'b101110 :
//若为零则显示空格
begin
data_in <= data2;
if(data2 == 8'b00110000 & data3 == 8'b00110000 & data4 == 8'b00110000 & data5 == 8'b00110000 & data6 == 8'b00110000 & data7 == 8'b00110000)
begin
data_in <= 8'b00100000;
end
else
begin
data_in <= data2;
end
end
6'b101111 :
//若为零则显示空格
begin
data_in <= data1;
if(data1 == 8'b00110000 & data2 == 8'b00110000 & data3 == 8'b00110000 & data4 == 8'b00110000 & data5 == 8'b00110000 & data6 == 8'b00110000 & data7 == 8'b00110000)
begin
data_in <= 8'b00100000;
end
else
begin
data_in <= data1;
end
end
6'b110000 :
begin
data_in <= data0;
end
6'b110110 :
//H
begin
data_in <= 8'b01001000;
end
6'b110111 :
//z
begin
data_in <= 8'b01111010;
end
default :
begin
data_in <= 8'b00100000;
end
endcase
end
assign lcd_rs =(state == WRITERAM | state == READRAM)? 1'b1 : 1'b0;
assign lcd_rw =(state == CLEAR | state == RETURNCURSOR | state == SETMODE | state ==
SWITCHMODE | state == SHIFT | state == SETFUNCTION | state == SETCGRAM | state == SETDDRAM | state == WRITERAM)? 1'b0 : 1'b1;
assign lcd_d =(state == CLEAR)? 8'b00000001 :(state == RETURNCURSOR)? 8'b00000010 :(state == SETMODE)? {6'b000001, cur_inc, cur_noshift} :(state == SWITCHMODE)? {5'b00001, open_display, open_cur, blank_cur} :(state == SHIFT)? {4'b0001, shift_display, left_shift, 2'b00} :(state == SETFUNCTION)? {3'b001, datawidth8, twoline, font5x10, 2'b00} :(state == SETCGRAM)? 8'b01000000 :(state == SETDDRAM & counter == 0)? 8'b10000000 :(state == SETDDRAM & counter!= 0)? 8'b11000000 :(state == WRITERAM)? data_in : 8'bZZZZZZZZ;
//时序进程
always @(posedge clk_int or posedge rst)
begin
if(rst)
begin
state <= IDLE;
counter <= 0;
div_counter <= 0;
flag <= 1'b0;
char_addr <= 6'b000000;
end
else
case(state)
IDLE :
begin
if(flag == 1'b0)
begin
state <= SETFUNCTION;
flag <= 1'b1;
counter <= 0;
div_counter <= 0;
end
else
begin
if(div_counter < DIVSS)
begin
div_counter <= div_counter + 1;
state <= IDLE;
end
else
begin
div_counter <= 0;
state <= IDLE;
end
end
end
CLEAR :
begin
state <= SETMODE;
end
SETMODE :
begin
state <= WRITERAM;
end
RETURNCURSOR :
begin
state <= WRITERAM;
end
SWITCHMODE :
begin
state <= CLEAR;
end
SHIFT :
begin
state <= IDLE;
end
SETFUNCTION :
begin
state <= SWITCHMODE;
end
SETCGRAM :
begin
state <= IDLE;
end
SETDDRAM :
begin
state <= WRITERAM;
end
READFLAG :
begin
state <= IDLE;
end
WRITERAM :
//可用来修改,实现1602的输出显示
begin
if((counter >= 6'd0 & counter <= 6'd14)|(counter >= 6'd40 & counter <= 6'd54))
begin
state <= WRITERAM;
//一行同时只能显示16个字符,第二行的首地址为40
char_addr <= char_addr + 1;
counter <= counter + 1;
end
else if(counter > 6'd14)
//换到第二行显示
begin
state <= SETDDRAM;
counter <= 6'd40;
char_addr <= 6'b101000;
end
else
begin
state <= SHIFT;
state <= READRAM;
end
end
READRAM :
begin
state <= IDLE;
end
default :
begin
state <= IDLE;
end
endcase
end endmodule
第三篇:课程设计----数字频率计
电子课程设计报告
设计课题: 数字频率计 作 者:
李成赞≦
专 业: 08信息工程 班 级:(2)班
学 号: 3081231201 日 期 2009年6月5日——2009年6月17日
指导教师: 廖 东 进
设计小组其他成员:叶昕瑜 史海镔 陈福青 姚闽 梁芳芳
衢州职业技术学院信息与电力工程系
前 言
一、频率计的基本原理:
频率计又称为频率计数器,是一种专门对被测信号频率进行测量的电子测量仪器。其最基本的工作原理为:当被测信号在特定时间段T内的周期个数为N时,则被测信号的频率f=N/T。
频率计主要由四个部分构成:时基(T)电路、输入电路、计数显示电路以及控制电路。在一个测量周期过程中,被测周期信号在输入电路中经过放大、整形、微分操作之后形成特定周期的窄脉冲,送到主门的一个输入端。主门的另外一个输入端为时基电路产生电路产生的闸门脉冲。在闸门脉冲开启主门的期间,特定周期的窄脉冲才能通过主门,从而进入计数器进行计数,计数器的显示电路则用来显示被测信号的频率值,内部控制电路则用来完成各种测量功能之间的切换并实现测量设置。
二、频率计的应用范围:
在传统的电子测量仪器中,示波器在进行频率测量时测量精度较低,误差较大。频谱仪可以准确的测量频率并显示被测信号的频谱,但测量速度较慢,无法实时快速的跟踪捕捉到被测信号频率的变化。正是由于频率计能够快速准确的捕捉到被测信号频率的变化,因此,频率计拥有非常广泛的应用范围。
在传统的生产制造企业中,频率计被广泛的应用在产线的生产测试中。频率计能够快速的捕捉到晶体振荡器输出频率的变化,用户通过使用频率计能够迅速的发现有故障的晶振产品,确保产品质量。
在计量实验室中,频率计被用来对各种电子测量设备的本地振荡器进行校准。在无线通讯测试中,频率计既可以被用来对无线通讯基站的主时钟进行校准,还可以被用来对无线电台的跳频信号和频率调制信号进行分析。
目 录
1、设计要求
数字频率计
2、第一章 系统概述
3、第二章单元电路设计与分析 3.1 数字频率计的基本原理 3.2 数字频率的设计 3.2.1 放大整形电路
3.2.2 时基电路
3.2.3 逻辑控制电路 3.2.4 输出实现器
4、第三章 总结设计
附录A 系统电路原理图
附录B 元件清单
附录C 参考文献
设 计 要 求
电子课程设计报告格式:
每人必须写出一份4000字以上设计总结报告,总结报告应包括以下内容:
题目名称、前言、目录、鸣谢、元器件明细表、附图、参数文献。
其中,前言应包含设计题目的主要内容、资料收集工作的简介。正文参考格式如下:
第一章 系统概述
简单介绍系统设计思路与总体解决的可行论证,各功能块的划分与组成,全面介绍总体工作或工作原理。
第二章 单元电路设计与分析
详细介绍个单元电路的选择、设计及工作原理分析,并介绍有关参数的计算及元件参数的选择等。
第三章 总结
简单介绍对设计题目的结论性意见,进一步完善或改进的意向性说明,总结设计课程的收获与体会。
元器件明细表主要用于列出本次课程设计中所用到的全部元器件。
附图要求用2#以上图纸画出总原理接线图,参考文献格式如下:
序号 作者名 书刊名 出版社 出版时间(刊号)
数字频率计(设计要求):
数字频率计是用来测量正弦信号、矩形信号等波形上工作频率的仪器,其测量结果直接用十进制数字显示。本题要求采用中、小规模集成芯片设计集成有下列功能的数字频率测量计:
被测信号的频率范围为1Hz—100KHz,分成两个频段,即1—999Hz、1—100KHz,用三位数码管显示测量数据,测量误差小于5%。
数字频率计
第一章 系统概述
为了使计数器被测信号的频率范围为1—999Hz、,用三位数码管显示测量数据。
第二章 单元电路设计与分析
一、数字频率计测频率的基本原理
所谓频率,就是周期性信号在单位时间(1s)内变化的次数。若在一定时间间隔T秒内测得 这个周期性信号的重复变化次数为N,则其频率可表示为:
f=N/T
图1——数字频率计的组成框图和波形图
图1是数字频率计的组成框图。被测信号v x 经放大整形电路变成计数器所要求的脉冲信号I,其频率与被测信号的频率f x 相同。时基电路提供标准时间基准信号II,其高电平持续时间t1=1 秒,当l秒信号来到时,闸门开通,被测脉冲信号通过闸门,计数器开始计数,直到l秒信号结束时闸门关闭,停止计数。若在闸门时间1s内计数器计得的脉冲个数为N,则被测信号频率f 逻辑控制电路的作用有两个:一是产生锁存脉冲IV,使显示器上的数x =NHz。字稳定;二是产生清“0”脉冲V,使计数器每次测量从零开始计数。
各信号之间的时序关系如图1所示。
二、数字频率计的电路设计
基本电路设计
数字频率计的基本框图如图1所示,各部分作用如下。
①放大整形电路
图2——放大整形电路图
放大整形电路由晶体管3DG100与74LS00等组成,其中3DGl00组成放大器将输入频率。为f 三角波等进行放大,与非门74LS00构成施密特触发器,它对放 x 的周期信号如正弦波、大器的输出信号进行整形,使之成为矩形脉冲。
②时基电路
图3——时基电路
时基电路的作用是产生一个标准时间信号(高电平持续时间为 1s),由定时器555构成的多谐振荡器产生。若振荡器的频率 f0 1/(t1 t 2)0.8Hz,则振荡器的输出波形如图1中的波形II所示,其中t1=1s,t2=0.25s。由公式t1=0.7(R1+R2)C和t2=0.7R2C,可计算出电阻R1、R2及电容C的值如图。
③逻辑控制电路
图4——逻辑控制电路
根据图1所示波形,在计数信号II结束时产生锁存信号IV,锁存信号IV 结束时产生 清“0”信号 V。脉冲信号IV和V可由两个单稳态触发器74LS123产生,它们的脉冲宽度由电路的时间常数决定。
设所存信号IV和清“0”信号V的脉冲宽度tw相同,如果要求tw=0.02s,则得:
tw=0.45RextCext=0.02s
若取 Rext=10kΩ,则 Cext=tw/0.45Rext=4.4μ
F。
由74LS123的功能(见下表1)可得,当 1R 1B 1 触发脉冲从1A端输入时,在触D
发脉冲的负跳变作用下,输出端1Q可获得一负脉冲,其波形关系正好满足图1所示的波形IV和V的要求。手动复位开关S按下时,计数器清“0”。
表1——74LS123功芯片能表
④输出实现器
图5——频率计算器
表2——74LS90的不同接线方法
锁存器的作用是将计数器在1s结束时所计得的数进行锁存,使显示器上能稳定地显示 此时计数器的值。如图所示,1s计数时间结束时,逻辑控制电路发出锁存信号IV,将此时计数器的值送译码显示器,选用两个8位锁存器74L273可以完成上述功能。当时锁存信号CP的正跳变来到时,锁存器的输出等于输入,从而将计数器的输出值送到锁存器的输出端。
高电平结束后,无论D为何值,输出端的状态仍保持原来的状态不变,所以在计数期间内,计数器的输出不会送到译码显示器。
表3——74LS273功能表
表4——74LS4
第三章 结束语
①设计总结
简易的数字频率计基本完成,各Vcc接电源正极,各开关控制电路的各个部分。整个电路综合使用了与门、非门、555定时器、显示器、74LS48译码器、74LS273锁存器、74LS90计数器等等的逻辑器件和施密特、可重触发器等模拟电子器件。
②设计心得、体会
本次课程设计由李成赞同学总设计,在廖东进老师辅导下顺利完成啦。通过本次的课程设计,加深了我对数字电子技术模拟电子两门课程的理解,强化了我对相关知识的记忆,提高了我对所学知识的应用。这极大扩展了我的视野,更加激发了我对这门课程的热爱,在设计的过程中,由于综合应用了各种学习、应用软件,例如:word、auto CAD、Multisim等,不但体改了技能,还能从中获得了成就感。通过这次设计,我完全知道了团队合作的所带来的快乐,集体的力量的强大性!我定位了我自己,发现自己的优势和不足,并且勉励自己不断进步,并对未来充满信心。
再此感谢给与指导的廖东进老师、李培江老师、黄云龙老师的指导。对本课程设计的的大力支持。
附录A
:
系
统
电
路
原
理
附录B:元件清单
附录C:参考文献
第四篇:数字频率计设计
数字频率计设计 1.设计任务
设计一简易数字频率计,其基本要求是:
1)测量频率范围1Hz~10Hz,量程分为4档,即×1,×10,×100,×1000。2)频率测量准确度fx2103.fx3)被测信号可以是下弦波、三角波和方波。4)显示方式为4位十进制数显示。5)使用EWB进行仿真。2.设计原理及方案
频率的定义是单位时间(1s)内周期信号的变化次数。若在一定时间间隔T内测得周期信号的重复变化次数为N,则其频率为
f=N/T 据此,设计方案框图如图1所示。
图1 数字频率计组成框图
其基本原理是,被测信号ux首先经整形电路变成计数器所要求的脉冲信号,频率与被测信号的频率fx相同。时钟电路产生时间基准信号,分频后控制计数与保持状态。当其高电平时,计数器计数;低电平时,计数器处于保持状态,数据送入锁存器进行锁存显示。然后对计数器清零,准备下一次计数。其波形逻辑关系图如图2所示。3.基本电路设计 1)整形电路
整形电路是将待测信号整形变成计数器所要求的脉冲信号。电路形式采用由555定时器所构成的施密特触发器,电路如图XXX所示。若待测信号为三角波,输入整形电路,设置分析为瞬态分析,启动电路,其输入、输出波形如图XXX所示。可见输出为方波,二者频率相同。
2)时钟产生电路
时钟信号是控制计数器计数的标准时间信号,其精度很大程度上决定了频率计的频率测量精度。当要求频率测量精度较高时,应使用晶体振荡器通过分频获得。在此频率计中,时钟信号采用555定时器构成的多谐振荡器电路,产生频率为1Kz的信号,然后再进行分频。多谐振荡器电路如图XXX所示。由555定时器构成多谐振荡器的周期计算公式为
XXXXXXXXXX 取XXXXXXXXXXXXXX,则得到振荡频率为1Kz的负脉冲,其振荡波形如图XXX所示。3)分频器电路
采用计数器构成分频电路,对1Kz的时钟脉冲进行分频,取得不同量程所需要的时间基准信号,实现量程控制。1Kz的时钟脉冲,对其进行3次10分频,每个10分频器的输出信号频率分别为100Hz,10Hz,1Hz三种时间基准信号。对应于以1Kz,100Hz,10Hz,1Hz的信号作为时间基准信号时,相应的量程为×1000,×100,×10,×1。
构成10分频带电路是采用十进制计数器74LS160实现的。具体电路及其输入、输出波形如图XXX所示。
(1)T触发器
T触发器电路是用来将分频带器输出阻抗的窄脉冲整形为方波,因为计数器需要用方波来控制其计数/保持状态的切换。整形后方波的频率为频器输出信号频率的一半,则对应于1Kz,100Kz,10Kz,1Hz的信号,T触发器输出信号的高电平持续时间分别为0.001s,0.01s,0.1s,1s。T触发器采用JK触发器7473为实现,其电路连接图及其输入、输出波形如图XXX所示。
(2)单稳触发器
单稳触发器用于产生一窄脉冲,以触发锁存器,使计数器在计数完毕后更新锁存器数值。单稳触发器电路采用555定时器实现,为了保证系统正常工作,单稳电路产生的脉冲宽度不能大于该量程分频带器输出信号的周期。例如,计数器的最大量程是×1000,对应分频带器输出的时间基准信号频率为1000Hz,周期是1ms。取单稳电路输出脉冲宽度TW=0.1ms。根据TW=1.1RC,取C=0.01Uf,则R=9.8KΩ,取标称什为10KΩ。单稳触发器输入信号是T触发器输出信号经Rd、Cd组成的微分器将方波变成尖脉冲后加到555定时器的触发器。电路图及输入、输出波形如图XXX所示。
(3)延迟反相器
延时反相器的功能是为了得到一个对计数器清零的信号。由于计数器清零是低电平有效,而且计数器清零必须在单稳触发信号之后,故延迟反相器是在上述单稳电路之后,再加一级单稳触发电路,且在其输出端加反相器输出。其输入、输出波形如图XXX所示。(4)计数器
计数器在T触发器输出信号的控制下,对经过整形的待测信号进行脉冲计数,所得结果乘以量程即为待测信号频率。
根据精度要求,采用4个十进制计数器级联,构成N=1000计数器。十进制计数器仍采用74LS160实现。其电路图如图XXX所示。其中计数器的清零信号由延迟反相器提供,控制信号由T触发器提供,计数器输出结果送入锁存器。
(5)锁存器和显示
计数器的结果进入锁存器锁存,4个七段数码管显示测试信号的频率。锁存器使用了两片8D集成触发器实现,其控制信号来自于延迟反相器,具体电路如图XXX所示。
(6)数字频率计的总体电路
图XXX是数字频率计的总体电路图。
4.测试
搭建好以上电路以后,进行调试,首先分模块进行调试,待每一个模块调试正确后,不规则进行联调。因为整个电路的分析是瞬态分析,故总体电路的分析需要较长时间。以上仅仅是学生所做综合电路分析与设计的例子,由于EWB5.12教学版本库元件的限制,有些电路与系统无法进行全部电路的仿真(例如收发信通信系统等),但有些局部电路也可以进行仿真,从而节省对这部分电路设计化费的时间。
第五篇:基于FPGA的简易数字频率计
EDA 简易数字频计 设计性实验 2008112020327 ** 电子信息科学与技术
物电
电工电子中心2009年5月绘制
2008.6.10 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
简易数字频率计设计
一.任务解析
通过对选择题的分析,认为该简易数字频率计应该能达到以下要求: 1. 准确测出所给的方波信号的频率(1HZ以上的信号)。2. 在显示环节上,应能实现高位清零功能。3. 另外还有一个总的清零按键。
二.方案论证
本实验中所做的频率计的原理图如上图所示。即在一个1HZ时钟信号的控制下,在每个时钟的上升沿将计数器的数据送到缓冲器中保存起来,再送数码管中显示出来。
第2页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
在本实验中,用到过几中不同的方案,主要是在1HZ时钟信号的选择和计数器清零环节上:
1. 在实验设计过程中,考滤到两种1HZ时钟信号其波形如下图所
对于上术的两种波形,可以调整各项参数来产生两种1HZ时钟信号。最后通过实验的验证发现第二种波形对于控制缓冲器获得数据和控制计数器清零更易实现。并且,用第二种波形做为时钟信号,可以在很短的高电平时间内对计数器清零,在低电平时间内让计数器计数,从面提高测量的精度。而用第一种波形则不易实现这个过程。
2.在计数器的清零过程中,也有两个方案,分别是能通过缓冲器反回一个清零信号,另一个是在时钟的控制下进行清零。最终通过实验发现,用时钟进行清零更易实现。因为如果用缓冲器反回一个清零信号,有一个清零信号归位问题,即当缓冲器反回一个低电平清零信号时,计数器实现清零,但不好控制让缓器冲的清零信号又回到高电平,否则计数器就一直处于清零状态面不能正常计数了。
三.实验步骤
通过上分析后,实验分为以下几步:
1.1HZ时钟信号的产生(产生该信号的模块如下):
module ones(clk,clkout);input clk;output clkout;parameter parameter N=24000000;n=24;
第3页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
reg [n:0]cnt;reg clkout;
always @(posedge clk)begin if(cnt==N)else end endmodule begin cnt=0;
clkout=1;clkout=0;end
end begin cnt=cnt+1;最终产生的信号的波形:
2. 计数模块。其主要公能是在每个被测信号的上升沿自动加一,并且有一个清零信号的输入端,在1HZ时钟信号的高电平时间里进行清零。模块如下:
module count_99999999(sign,clr,b0,b1,b2,b3,b4,b5,b6,b7);input sign,clr;output [3:0]b0,b1,b2,b3,b4,b5,b6,b7;reg [3:0]b0,b1,b2,b3,b4,b5,b6,b7;always @(posedge sign or posedge clr)
if(clr)begin b0=0;b1=0;b2=0;b3=0;b4=0;b5=0;b6=0;b7=0;end else begin if(b0<9)b0=b0+1;else begin b0=0;if(b1<9)
第4页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
b1=b1+1;else begin b1=0;if(b2<9)b2=b2+1;else begin
b2=0;
if(b3<9)
b3=b3+1;
else begin
b3=0;
if(b4<9)
b4=b4+1;
else begin
b4=0;
if(b5<9)
b5=b5+1;
else begin
b5=0;
if(b6<9)
b6=b6+1;
else begin
b6=0;
if(b7<9)
b7=b7+1;
else b7=0;
第5页,共11页
湖北师范学院电工电子实验教学省级示范中心电子版实验报告
end
end
end
end
end
end end
end endmodule 如果要访真该模块,要设定较长的访真时间,故在此不进行软件访真,只在实验箱上进行实验。
3. 数据缓冲模块。在每个秒级门控信号的上升沿接收计数器的数据,并送到驱动八个数码管的显示模块里。
module fre_count(clk,clr,b0,b1,b2,b3,b4,b5,b6,b7,a0,a1,a2,a3,a4,a5,a6,a7);input clk,clr;input [3:0]b0,b1,b2,b3,b4,b5,b6,b7;output [3:0]a0,a1,a2,a3,a4,a5,a6,a7;reg clro;reg [3:0]a0,a1,a2,a3,a4,a5,a6,a7;always @(posedge clk or negedge clr)//clk应该为1HZ的信号// begin if(!clr)
begin
a0<=0;a1<=0;a2<=0;a3<=0;a4<=0;a5<=0;a6<=0;a7<=0;end else
第6页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
end begin a0<=b0;a1<=b1;a2<=b2;a3<=b3;a4<=b4;a5<=b5;a6<=b6;a7<=b7;end endmodule 在此模块中用了到了<=阻塞赋值的方式。
4.编写控制高位清零的模块,利用在扫描模块中控制SEL的值来实现高位清零。即先从高位开始判断,当只有个位有数据时,SEL只能等于0,当只有个位和十位有数据时,SEL要小于1,依此类推,实现高位清零功能。module scan(clk,a1,a2,a3,a4,a5,a6,a7,sel);input clk;input [3:0]a1,a2,a3,a4,a5,a6,a7;output [2:0]sel;reg [2:0]sel;always @(posedge clk)if({a1,a2,a3,a4,a5,a6,a7}==0000000)sel=0;else if({a2,a3,a4,a5,a6,a7}==000000)if(sel<1)sel=sel+1;else sel=0;else if({a3,a4,a5,a6,a7}==00000)if(sel<2)sel=sel+1;else sel=0;else if({a4,a5,a6,a7}==0000)if(sel<3)sel=sel+1;
第7页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
else sel=0;else if({a5,a6,a7}==000)if(sel<4)sel=sel+1;else sel=0;else if({a6,a7}==00)if(sel<5)sel=sel+1;else sel=0;else if({a7}==0)if(sel<6)sel=sel+1;else sel=0;else sel=sel+1;endmodule 5.上述三个模块为本次实验的主要模块。除此,还用到了,译码,数据选择器模块。相应的模块代码省略。
6.所有模块都写完后,就是写顶层文件。
module top(clk,clr,sig_in,a,b,c,d,e,f,g,dp,sel);input clk,clr,sig_in;output [2:0]sel;output a,b,c,d,e,f,g,dp;
wire clk1,clk2,clk3;wire [2:0]sel_sign;wire [3:0] QA,QB,QC,QD,QE,QF,QG,QH;wire [3:0] b0_o,b1_o,b2_o,b3_o,b4_o,b5_o,b6_o,b7_o;wire [3:0] org_data;
第8页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
assign sel=sel_sign;assign clk3=clk;
fre_count frequence(.clk(clk2),.clr(clr),.b0(b0_o),.b1(b1_o),.b2(b2_o),.b3(b3_o),.b4(b4_o),.b5(b5_o),.b6(b6_o),.b7(b7_o),.a0(QA),.a1(QB),count_99999999 mycounter(.sign(sig_in),.clr(clk2),.b0(b0_o),.b1(b1_o),.a2(QC),.a3(QD),.a4(QE),.a5(QF),.a6(QG),.a7(QH));.b2(b2_o),.b3(b3_o),.b4(b4_o),.b5(b5_o),.b6(b6_o),.b7(b7_o));
clk_div clksource(.clk(clk3),.clko1(clk1));
ones ones_con(.clk(clk3),.clkout(clk2));scan myscan(.clk(clk1),.a1(QB),.a2(QC),.a3(QD),.a4(QE),.a5(QF),.a6(QG),.a7(QF),.sel(sel_sign));mux81 mymux81(.sel(sel_sign),.a(QA),.b(QB),.c(QC),.d(QD),.e(QE),.f(QF),.g(QG),.h(QH),.out(org_data));
第9页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
decode3_8 decode(.org(org_data),.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g),.dp(dp));
endmodule
7. 写完了全部代码后,就是器件选择,分配引脚,下载程序,最后在实验箱上进行实验。
在实验的验证过程中,用到了DDS函数信号发生器,从其TTL输出端输出各种不同频率的方波信号,接入接简易频率计的被测信号输入端,在八个数码管上显示出相应的测量结果。
四.结果分析
在上述实验过程中,我们选取了若干组不同的TTL输出进行测量,发现当被测信号的频率不小于1HZ时,简易频率计可以精确的测出被测信号的频率。但是,当被测信号小于1HZ时,显示的测量结果在0和1之间跳动,不稳定。分析简易频率计的结构可知,在如下图所示波形关系中,当被测信号的频率小于1HZ时,在秒级门控信号的一个周期内,计数器要么能计数一次,要么计数零次,因而不能准确的测出被测信号的频率。
五.经验总结
1.本实验中的频率计由于其在结构上存在缺限,因而在测量小于1HZ的信号时,会有较大的误码差,在测量频率大于1HZ信号时,也可能存1HZ误差,其原因在于如果在一个秒级门控信号的周期内,被测信号的上升沿的个数正好
第10页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
和其周数相同,则测量结果是准确的,如果上升沿的个数比周期数多一,则测量结果比实际值大一。
2.提高测量精度的另一个关键地方在所产生的秒级门控信号的精度。只有所产生的秒级门控信号的低电平时间长度为严格的一秒时,测量结果才会更精确。由于实验箱上所使用的晶振不是严格等于24MHZ,因而可用示波器测出晶振的准确频率后,再在parameter
N=24000000;语句中改变N的值。也可以在实验中逐渐调整N的值,直到测量结果最精确为止。最终我们的实验中,N的值取的是24000351。
3.对于高位清零功能的加入,正是仪器设计人性化的一个体现。如果没有这个功能,再未显示数据的数码管也一直处于工作状态,一则是对资源的乱费,二则是会减少器件的使用寿命。
第11页,共11页