第一篇:基于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页
第二篇:基于FPGA的数字频率计设计报告
电子技术综合试验实验报告
班级:测控一班
学号:2907101002
姓名:李大帅 指导老师:李颖
基于FPGA的数字频率计设计报告
一、系统整体设计
设计要求:
1、被测输入信号:方波
2、测试频率范围为:10Hz~100MHz
3、量程分为三档:第一档:闸门时间为1S时,最大读数为999.999KHz
第二档:闸门时间为0.1S时,最大读数为9999.99KHz
第三档:闸门时间为0.01S时,最大读数为99999.9KHz。
4、显示工作方式:a、用六位BCD七段数码管显示读数。
b、采用记忆显示方法
c、实现对高位无意义零的消隐。
系统设计原理:
所谓“频率”,就是周期性信号在单位时间(1秒)内变化的次数。若在一定的时间间隔T内计数,计得某周期性信号的重复变化次数为N,则该信号的频率可表达为:f = N / T.基于这一原理我们可以使用单位时间内对被测信号进行计数的方法求得对该信号的频率测量,具体实现过程简述如下: 首先,将被测信号①(方波)加到闸门的输入端。由一个高稳定的石英振荡器和一系列数字分频器组成了时基信号发生器,它输出时间基准(或频率基准)信号③去控制门控电路形成门控信号④,门控信号的作用时间T是非常准确的(由石英振荡器决定)。门控信号控制闸门的开与闭,只有在闸门开通的时间内,方波脉冲②才能通过闸门成为被计数的脉冲⑤由计数器计数。
闸门开通的时间称为闸门时间,其长度等于门控信号作用时间T。比如,时间基准信号的重复周期为1S,加到闸门的门控信号作用时间T亦准确地等于1S,即闸门的开通时间——“闸门时间”为1S。在这一段时间内,若计数器计得N=100000个数,根据公式f = N / T,那么被测频率就是100000Hz。如果计数式频率计的显示器单位为“KHz”,则显示100.000KHz,即小数点定位在第三位。不难设想,若将闸门时间设为T=0.1S,则计数值为10000,这时,显示器的小数点只要根据闸门时间T的改变也随之自动往右移动一位(自动定位),那么,显示的结果为100.00Khz。在计数式数字频率计中,通过选择不同的闸门时间,可以改变频率计的测量范围和测量精度。
系统单元模块划分: 1)分频器,将产生用于计数控制的时钟分别为1HZ,10HZ,100HZ脉冲和1KHZ的用于七段显示数码管扫描显示的扫描信号。
2)闸门选择器,用于选择不同的闸门时间以及产生后续的小数点的显示位置。3)门控电路,产生用于计数的使能控制信号,清零信号以及锁存器锁存信号。4)计数器,用于对输入的待测信号进行脉冲计数,计数输出。
5)锁存器,用于对计数器输出数据的锁存,便于后续译码显示电路的对数据进行记忆显示,同时避免计数器清零信号对数据产生影响。
6)译码显示,用于产生使七段显示数码管的扫描数字显示,小数点显示的输出信号,同时对高位的无意义零进行消隐。
二、单元电路设计
1、分频器:
该电路将产生四个不同频率的信号输出,因为电路板上给出了一个48MHZ的晶振,所以我们只需要对48MHZ的信号进行适当分频即可得到我们所需的四个不同频率的信号输出,我们设计一个输入为48MHZ,有四个输出端分别为1HZ,10HZ和100HZ,1KHZ的分频器,原程序如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity fenpinqi is Port(clk : in STD_LOGIC;clkout1 : out STD_LOGIC;clkout10 : out STD_LOGIC;clkout100 : out STD_LOGIC;clkout1K : out STD_LOGIC);end fenpinqi;
architecture Behavioral of fenpinqi is signal cnt1:integer range 1 to 24000000;signal cnt10:integer range 1 to 2400000;signal cnt100:integer range 1 to 240000;signal cnt1K:integer range 1 to 24000;signal c1:std_logic;signal c2:std_logic;signal c3:std_logic;signal c4:std_logic;begin process(clk)is begin if clk'event and clk='1' then if cnt1<24000000 then
--对cnt1进行计数,当cnt1未计满后对其进行加1 cnt1<=cnt1+1;elsif cnt1=24000000 then
--cnt1计满后对其进行赋一,并且令c1进行翻转,然后将c1的值赋给clkout1
c1<=not c1;--由于48MHZ的的信号,前一半的时候c1为0,则后一半是为1,就完成了对信号进行分频,产生了1HZ的信号 cnt1<=1;end if;end if;end process;process(clk)is begin if clk'event and clk='1' then--方法同上
if cnt10<2400000 then cnt10<=cnt10+1;elsif cnt10=2400000 then c2<=not c2;
cnt10<=1;
end if;end if;end process;
process(clk)is begin
if clk'event and clk='1' then
--方法同上
if cnt100<240000 then
cnt100<=cnt100+1;
elsif cnt100=240000 then
c3<=not c3;
cnt100<=1;
end if;end if;end process;
process(clk)is begin
if clk'event and clk='1' then
--方法同上
if cnt1K<24000000 then
cnt1K<=cnt1K+1;
elsif cnt1=24000 then
c4<=not c4;
cnt1K<=1;
end if;end if;end process;clkout1<=c1;clkout10<=c2;clkout100<=c3;clkout1K<=c4;end Behavioral;源文件编写成功后编译并生成图形文件符号如图:仿真文件编写如下:
LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.all;USE ieee.numeric_std.ALL;
ENTITY tbb_vhd IS END tbb_vhd;ARCHITECTURE behavior OF tbb_vhd IS COMPONENT fenpinqi 4
BEGIN
END;uut: fenpinqi PORT MAP(clk => clk,clkout1 => clkout1, clkout10 => clkout10, clkout100 => clkout100, clkout1K => clkout1K);PORT(clk : IN std_logic;
clkout1 : OUT std_logic;clkout10 : OUT std_logic;clkout100 : OUT std_logic;clkout1K : OUT std_logic);END COMPONENT;SIGNAL clk : std_logic := '0';SIGNAL clkout1 : std_logic;SIGNAL clkout10 : std_logic;SIGNAL clkout100 : std_logic;SIGNAL clkout1K : std_logic;tb : PROCESS BEGIN
clk<='0';wait for 10 ps;clk<='1';wait for 10 ps;END PROCESS;对该模块进行仿真结果如下:
有上图可知分频器工作正常,产生的个信号也没有毛刺,结果十分理想。
2、闸门选择器:
在这个模块中我们有四个输出端和六个输入端,其中四个输出端中有一个是频率输出端,是通过三个闸门选择开关输入和三个输入频率决定的,另外三个输出端则是用来后面的小数点控制的,而六个输入端中的三个是上面分频器的三个输出1HZ,10HZ和100HZ,另外三个是电路板上的拨动开关,用来选择闸门,控制输出。其原程序和分析如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity SELE is Port(SE1 : in STD_LOGIC;
SE10 : in STD_LOGIC;SE100 : in STD_LOGIC;F1HZ : IN STD_LOGIC;F10HZ : IN STD_LOGIC;F100HZ :IN STD_LOGIC;FREF : out STD_LOGIC;DP1 : out STD_LOGIC;DP2 : out STD_LOGIC;DP3 : out STD_LOGIC);end SELE;architecture Behavioral of SELE is begin PROCESS(SE1,SE10,SE100)IS BEGIN IF SE1='1' AND SE10='0' AND SE100='0' THEN
FREF<=F1HZ;--当闸门控制在第一档的时候,令输出端输出1HZ输入端的输入,小数点控制dp1有效,dp2,dp3无效
DP1<='0';
DP2<='1';DP3<='1';END IF;IF SE1='0' AND SE10='1' AND SE100='0' THEN
FREF<=F10HZ;
--第二档,输出为10HZ,dp2有效
DP1<='1';
DP2<='0';DP3<='1';END IF;IF SE1='0' AND SE10='0' AND SE100='1' THEN
FREF<=F100HZ;
--第三档,输出为100HZ,dp3有效
DP1<='1';
DP2<='1';DP3<='0';END IF;END PROCESS;end Behavioral;源代码编写完成后保存并生成图形文件符号如图:
仿真文件编写如下:
LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.all;USE ieee.numeric_std.ALL;
ENTITY TTB_vhd IS END TTB_vhd;ARCHITECTURE behavior OF TTB_vhd IS COMPONENT SELE
PORT(SE1 : IN std_logic;
SE10 : IN std_logic;
SE100 : IN std_logic;
F1HZ : IN std_logic;
F10HZ : IN std_logic;
F100HZ : IN std_logic;
FREF : OUT std_logic;
DP1 : OUT std_logic;
DP2 : OUT std_logic;DP3 : OUT std_logic);END COMPONENT;SIGNAL SE1 : std_logic := '1';SIGNAL SE10 : std_logic := '0';SIGNAL SE100 : std_logic := '0';SIGNAL F1HZ : std_logic := '0';SIGNAL F10HZ : std_logic := '0';SIGNAL F100HZ : std_logic := '0';SIGNAL FREF : std_logic;SIGNAL DP1 : std_logic;SIGNAL DP2 : std_logic;SIGNAL DP3 : std_logic;BEGIN uut: SELE PORT MAP(SE1 => SE1,SE10 => SE10,SE100 => SE100,F1HZ => F1HZ,F10HZ => F10HZ,F100HZ => F100HZ,FREF => FREF,DP1 => DP1,DP2 => DP2, DP3 => DP3);
tb : PROCESS BEGIN
F1HZ<='0';FREF<='0';
wait for 100 ns;
F1HZ<='1';FREF<='1';WAIT FOR 100 NS;END PROCESS;END;仿真结果如图:
有仿真结果可知闸门选择器工作正常,能够准确输出我们所需的信号。
3、门控信号:
在此模块中有一个输入端和两个输出端,输入端为上面的闸门选择器输出的频率,两个输出端分别为计数器是能控制信号(锁存器控制信号),和计数器清零信号。具体源程序即分析如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity CONTROLS is Port(FREF : in STD_LOGIC;GAT : out STD_LOGIC;CLR : out STD_LOGIC);end CONTROLS;
architecture Behavioral of CONTROLS is SIGNAL G1: STD_LOGIC:='0';begin
PROCESS(FREF)IS
BEGIN IF FREF'EVENT AND FREF='1' THEN G1<=NOT G1;--该过程对时钟信号又一次进行分频,产生出半个周期时间为1的控制信号,作为计数使能,保证了时间的准确性
END IF;END PROCESS;PROCESS(FREF,G1)IS
BEGIN IF FREF='0' AND G1='0' THEN CLR<='1';--该过程产生清零信号,即当使能信号为无效0同时时钟为0时,即在技术始终无效半个时钟时间后,对计数器清零
--清零信号高电平有效 ELSE CLR<='0';END IF;END PROCESS;GAT<=G1;--将G1赋给gat输出端,它是计数器的使能信号同时也是锁存器的锁存信号
end Behavioral;源文件编写完成后保存编译并生成图形文件符号如图:
仿真文件代码如下:
LIBRARY ieee;8
USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.all;USE ieee.numeric_std.ALL;
ENTITY TBCON_vhd IS END TBCON_vhd;ARCHITECTURE behavior OF TBCON_vhd IS
BEGIN
END;tb : PROCESS BEGIN
FREF<='0';WAIT FOR 100 NS;FREF<='1';WAIT FOR 100 NS;uut: CONTROLS PORT MAP(FREF => FREF, GAT => GAT, CLR => CLR);COMPONENT CONTROLS PORT(FREF : IN std_logic;
GAT : OUT std_logic;CLR : OUT std_logic);END COMPONENT;SIGNAL FREF : std_logic := '0';SIGNAL GAT : std_logic;SIGNAL CLR : std_logic;END PROCESS;对上面的文件进行仿真,结果如下:
由上图的仿真结果可知,控制电路工作正常,输出信号稳定,很理想。同时我们也可以看出来该模块对分频器的时钟输出的稳定性依赖十分严重,一旦分频器输出时钟有毛刺,该控制信号将会完全的无效,这也是为什么我知道上面的分频器设计不是最优的方案,却还是采用了上述方法的原因。
4、计数器:
该模块实现的功能是对输入信号脉冲的计数,并正确的输出结果和溢出。使用上面的门控信号产生的gat信号控制计数器的使能端,以实现计数器的定时计数。该模块是使用六个十进制计数器同步并联而成的,首先我们设计用于并联的十进制计数器,原程序如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;9
entity CNT10 is Port(CLK : in STD_LOGIC;CLR : in STD_LOGIC;
ENA : in STD_LOGIC;CQ : out STD_LOGIC_VECTOR(3 downto 0);CO : out STD_LOGIC);end CNT10;
architecture Behavioral of CNT10 is SIGNAL CQI: STD_LOGIC_VECTOR(3 DOWNTO 0):=“0000”;
--定义中间信号CQI,用于数据输出的循环计数
begin
PROCESS(CLK,CLR)IS
end Behavioral;
BEGIN IF CLR='1' THEN CQI<=“0000”;
--当CLR清零信号有效时使输出为0000,无效时进行下述操作--对时钟进行计数 ELSIF CLK'EVENT AND CLK='1' THEN
IF ENA='1' THEN
--判断使能信号,有效则进行计数,否则不作处理
--数据0~9循环,计满后重新回到0 IF CQI=“1001” THEN CQI<=“0000”;ELSE CQI<=CQI+'1';END IF;END IF;END IF;END PROCESS;CO <= '1' when ena = '1' and cqi = 9 else '0';CQ<=CQI;
--进位信号,最高位的仅为信号作为计数的溢出信号
--当且仅当使能有效且计数为9时产生进位信号,进位信号1有效,同步并联时连高位的使能端
文件编写完成后保存编译生成图形文件符号,如上图:
创建图形文件cnt6并按照下图进行连接,保存后编译生成图形文件符号如图:
仿真文件代码如下:
LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.all;USE ieee.numeric_std.ALL;
ENTITY TBCNT10_vhd IS END TBCNT10_vhd;ARCHITECTURE behavior OF TBCNT10_vhd IS
COMPONENT CNT10 PORT(CLK : IN std_logic;
CLR : IN std_logic;ENA : IN std_logic;CQ : OUT std_logic_vector(3 downto 0);CO : OUT std_logic);END COMPONENT;SIGNAL CLK : std_logic := '0';SIGNAL CLR : std_logic := '0';SIGNAL ENA : std_logic := '1';SIGNAL CQ : std_logic_vector(3 downto 0);SIGNAL CO : std_logic;BEGIN
END;tb : PROCESS BEGIN
CLK<='0';wait for 100 ns;CLK<='1';WAIT FOR 100 NS;uut: CNT10 PORT MAP(CLK => CLK, CLR => CLR, ENA => ENA, CQ => CQ, CO => CO);END PROCESS;仿真结果如图:
如仿真结果我们可以看出,该模块运行正常,计数稳定,结果十分理想。
5、锁存器:
由于前面的计数器的输出为六组四位二进制数和一个溢出信号,所以我们使用的锁存器也使用六个四位锁存器和一个一位锁存器。锁存器使用下降沿锁存,即当计数器的使能信号变为无效的一瞬间我们令锁存器将数据锁存。四位锁存器的原代码如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity LATCH4 is Port(CLK : in STD_LOGIC;DIN : in STD_LOGIC_VECTOR(3 downto 0);QOU : out STD_LOGIC_VECTOR(3 downto 0));end LATCH4;architecture Behavioral of LATCH4 is begin
PROCESS(CLK,DIN)IS
BEGIN
IF CLK'EVENT AND CLK='0' THEN--当时钟信号下降沿时,实现锁存
QOU<=DIN;
END IF;END PROCESS;end Behavioral;上述文件编写完成后保存编译生成图形文件符号如图: 再编写一位锁存器,源程序代码如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity LATCH1 is Port(CLK : in STD_LOGIC;DIN : in STD_LOGIC_VECTOR;QOU : out STD_LOGIC_VECTOR);end LATCH1;architecture Behavioral of LATCH1 is begin
PROCESS(CLK,DIN)IS
BEGIN
IF CLK'EVENT AND CLK='0' THEN--当时钟信号下降沿时,实现锁存
QOU<=DIN;
END IF;END PROCESS;end Behavioral;
文件编写完成后保存编译生成图形文件符号,如图:
锁存完成后有六组四位二进制数和一个一位二进制数,所以我们队总线进行了合并,即将六组四位数合并成一个二十四位数,合并程序如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ADVOCATES is Port(S0 : in STD_LOGIC_VECTOR(3 downto 0);S1 : in STD_LOGIC_VECTOR(3 downto 0);S2 : in STD_LOGIC_VECTOR(3 downto 0);S3 : in STD_LOGIC_VECTOR(3 downto 0);S4 : in STD_LOGIC_VECTOR(3 downto 0);S5 : in STD_LOGIC_VECTOR(3 downto 0);S6 : out STD_LOGIC_VECTOR(23 downto 0));
end ADVOCATES;
architecture Behavioral of ADVOCATES is
begin S6(23 DOWNTO 20)<=S0;S6(19 DOWNTO 16)<=S1;S6(15 DOWNTO 12)<=S2;S6(11 DOWNTO 8)<=S3;S6(7 DOWNTO 4)<=S4;S6(3 DOWNTO 0)<=S5;end Behavioral;--将总线的对应位进行连接
文件编写完成后保存编译生成图形文件符号,如图:
创建该模块的顶层图形文件LAT.sch将上述个文件按照如图所示连接,保存编译生成图形文件符号如图:
该模块的输入输出简单,无需仿真。
6、译码显示:
该模块实现的是对锁存器锁存的数据进行处理并显示输出,以及小数点的不同闸门的输出显示,以及电路板上七段显示译码管的扫描信号输出。其中对锁存数据的处理包括溢出有效时的数据消除,和对高位无意义零的自动消隐。首先我们编写小数点控制的源文件代码:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity POINTCON is Port(SE1 : in STD_LOGIC;SE10 : in STD_LOGIC;SE100 : in STD_LOGIC;SEL : in STD_LOGIC_VECTOR(2 downto 0);DP : out STD_LOGIC);end POINTCON;
architecture Behavioral of POINTCON is begin
PROCESS(SE1,SE10,SE100,SEL)IS
BEGIN
IF SE1='1' AND SE10='0' AND SE100='0' AND SEL=“011” THEN DP<='0';
--当为第一档时,令第四位的数码管的小数点点亮,其他的不亮
ELSIF SE1='0' AND SE10='1' AND SE100='0' AND SEL=“010” THEN DP<='0';
--第二档时,第三位的数码管小数点点亮
ELSIF SE1='0' AND SE10='0' AND SE100='1' AND SEL=“001” THEN DP<='0';
--第三档时,第二位的小数点点亮--不符合上述三档时,小数点全部消隐 ELSE DP<='1';END IF;END PROCESS;end Behavioral;编写完成后保存编译生成图形文件符号如图:
再编写用于数码管扫描显示的的位选信号生成文件,其代码如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity CTRLS is Port(CLK : in STD_LOGIC;SEL : out STD_LOGIC_VECTOR(2 downto 0));end CTRLS;
architecture Behavioral of CTRLS is SIGNAL CNT: STD_LOGIC_VECTOR(2 DOWNTO 0):=“000”;begin PROCESS(CLK)IS 14
BEGIN IF CLK'EVENT AND CLK='1' THEN
--接入1KHZ的时钟信号,使CNT进行循环计数,从000到101
IF CNT=”101” THEN CNT<=”000”;--计满则清零,不满则加一
ELSE CNT<=CNT+’1’;END IF;END IF;END PROCESS;SEL<=CNT;--将CNT信号赋给SEL输出
end Behavioral;文件编写完成后保存编译生成图形文件符号如图:
再编写使高位无意义零自动消隐功能的的文件,源程序代码如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity DSELE is Port(DP1: IN STD_LOGIC;DP2: IN STD_LOGIC;DIN : in STD_LOGIC_VECTOR(23 downto 0);QOU : out STD_LOGIC_VECTOR(23 downto 0));end DSELE;architecture Behavioral of DSELE is begin PROCESS(DP1,DP2,DIN)IS
BEGIN
IF DP1='0' AND DP2='1' THEN
IF DIN(23 DOWNTO 20)=“0000” THEN
QOU(23 DOWNTO 20)<=“1111”;
QOU(19 DOWNTO 0)<=DIN(19 DOWNTO 0);
END IF;
IF DIN(23 DOWNTO 20)=“0000” AND DIN(19 DOWNTO 16)=“0000” THEN
QOU(23 DOWNTO 20)<=“1111”;
QOU(19 DOWNTO 16)<=“1111”;
QOU(15 DOWNTO 0)<=DIN(15 DOWNTO 0);
END IF;
END IF;
IF DP1='1' AND DP2='0' THEN
IF DIN(23 DOWNTO 20)=“0000” THEN
QOU(23 DOWNTO 20)<=“1111”;
QOU(19 DOWNTO 0)<=DIN(19 DOWNTO 0);
END IF;
IF DIN(23 DOWNTO 20)=“0000” AND DIN(19 DOWNTO 16)=“0000” THEN
QOU(23 DOWNTO 20)<=“1111”;QOU(19 DOWNTO 16)<=“1111”;
THEN
QOU(23 DOWNTO 20)<=“1111”;QOU(19 DOWNTO 16)<=“1111”;QOU(15 DOWNTO 12)<=“1111”;QOU(11 DOWNTO 8)<=“1111”;QOU(7 DOWNTO 0)<=DIN(7 DOWNTO 0);
QOU(15 DOWNTO 0)<=DIN(15 DOWNTO 0);END IF;IF DIN(23 DOWNTO 20)=“0000” AND DIN(19 DOWNTO 16)=“0000” AND DIN(15 DOWNTO 12)=“0000” THEN
QOU(23 DOWNTO 20)<=“1111”;QOU(19 DOWNTO 16)<=“1111”;QOU(15 DOWNTO 12)<=“1111”;QOU(11 DOWNTO 0)<=DIN(11 DOWNTO 0);END IF;END IF;IF DP1='1' AND DP2='1' THEN
IF DIN(23 DOWNTO 20)=“0000” THEN QOU(23 DOWNTO 20)<=“1111”;QOU(19 DOWNTO 0)<=DIN(19 DOWNTO 0);END IF;IF DIN(23 DOWNTO 20)=“0000” AND DIN(19 DOWNTO 16)=“0000” THEN
QOU(23 DOWNTO 20)<=“1111”;QOU(19 DOWNTO 16)<=“1111”;QOU(15 DOWNTO 0)<=DIN(15 DOWNTO 0);END IF;IF DIN(23 DOWNTO 20)=“0000” AND DIN(19 DOWNTO 16)=“0000” AND DIN(15 DOWNTO 12)=“0000” THEN
QOU(23 DOWNTO 20)<=“1111”;QOU(19 DOWNTO 16)<=“1111”;QOU(15 DOWNTO 12)<=“1111”;QOU(11 DOWNTO 0)<=DIN(11 DOWNTO 0);END IF;IF DIN(23 DOWNTO 20)=“0000” AND DIN(19 DOWNTO 16)=“0000” AND DIN(15 DOWNTO 12)=“0000” AND DIN(11 DOWNTO 8)=“0000” END IF;END IF;END PROCESS;end Behavioral;该段代码的编写的主要原理是首先判断小数点的位置,然后对小数点前的高位数从高到低依次进行判断,如果高位为零则将数据取反,在后续译码中将不再显示,从而实现高位无意义零的自动消隐。代码编写完成后保存编译生成图形文件符号如上图: 然后我们编写数据显示输出文件,代码如下:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity DISPLAY1 is 16
Port(SEL : in STD_LOGIC_VECTOR(2 downto 0);
OVERIN : IN STD_LOGIC;
DATAIN : in STD_LOGIC_VECTOR(23 downto 0);SEG : OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END DISPLAY1;
architecture Behavioral of DISPLAY1 is SIGNAL DATA: STD_LOGIC_VECTOR(3 DOWNTO 0):=“0000”;BEGIN PROCESS(SEL,OVERIN)IS
BEGIN
CASE SEL IS
--对位选信号进行判断,对应每一位分别提取数据中的不同位置的数据赋给中间信号DATA
WHEN “000”=>DATA<=DATAIN(3 DOWNTO 0);
WHEN “001”=>DATA<=DATAIN(7 DOWNTO 4);
WHEN “010”=>DATA<=DATAIN(11 DOWNTO 8);
WHEN “011”=>DATA<=DATAIN(15 DOWNTO 12);
WHEN “100”=>DATA<=DATAIN(19 DOWNTO 16);
WHEN “101”=>DATA<=DATAIN(23 DOWNTO 20);
WHEN OTHERS=>DATA<=“0000”;
END CASE;
CASE DATA IS
--对中间信号DATA进行译码,SEG为数码管的数据显示输出,从而使不同位置上有不同的数字显示
WHEN “0000”=>SEG<=“1000000”;
WHEN “0001”=>SEG<=“1111001”;
WHEN “0010”=>SEG<=“0100100”;
WHEN “0011”=>SEG<=“0110000”;
WHEN “0100”=>SEG<=“0011001”;
WHEN “0101”=>SEG<=“0010010”;
WHEN “0110”=>SEG<=“0000010”;
WHEN “0111”=>SEG<=“1111000”;
WHEN “1000”=>SEG<=“0000000”;
WHEN “1001”=>SEG<=“0010000”;
WHEN OTHERS=>SEG<=“1111111”;
END CASE;
if OVERIN='1' THEN
--判断溢出,若溢出则令输出全部不显示
SEG<=“1111111”;END IF;END PROCESS;end Behavioral;代码编写完成后保存编译生成图形文件符号如图:
建立该模块的顶层图形文件DISPLAY.sch,按照下图连接各元件,保存编译生成图形文件符号如下图:17
该模块的输入数据量太大难以仿真,故这里只对其中的扫描信号生成文件进行仿真,仿真文件代码如下:
LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.all;USE ieee.numeric_std.ALL;
ENTITY TBCTRLS_vhd IS END TBCTRLS_vhd;ARCHITECTURE behavior OF TBCTRLS_vhd IS
BEGIN
END;uut: CTRLS PORT MAP(CLK => CLK, SEL => SEL);COMPONENT CTRLS PORT(CLK : IN std_logic;
SEL : OUT std_logic_vector(2 downto 0));END COMPONENT;SIGNAL CLK : std_logic := '0';SIGNAL SEL : std_logic_vector(2 downto 0);tb : PROCESS BEGIN
CLK<='0';WAIT FOR 100 NS;CLK<='1';WAIT FOR 100 NS;END PROCESS;结果如下:
有仿真结果我们可以看出程序运行正常,逻辑上没有任何问题。至此所有的单元电路全部完成。
三、设计实现
1、顶层文件:
创建图形文件FRYALL.sch,按照下图连接各模块生成的图形文件符号,完成后保存编译。
2、管脚分配:
由系统的顶层文件可以看到该系统的输入端共有5个,输出端有11个,管脚分配文件FRYALL.ucf如下:
NET “CLKIN” LOC = T8;NET “DCLK” LOC = C16;NET “DP” LOC = C11;NET “NECT” LOC = D7;NET “SE1” LOC = L6;NET “SE10” LOC = N5;NET “SE100” LOC = L7;NET “SEG<0>” LOC = B14;NET “SEG<1>” LOC = A13;NET “SEG<2>” LOC = C13;NET “SEG<3>” LOC = C12;NET “SEG<4>” LOC = A12;NET “SEG<5>” LOC = B12;NET “SEG<6>” LOC = A11;NET “SEL<0>” LOC = F8;NET “SEL<1>” LOC = D8;NET “SEL<2>” LOC = E7;19
3、下载过程:
光标移至【Generate Programing File】后单击鼠标右键,然后单击【Properties】在打开的对话框的左侧栏选中【Configuration Options】将右侧的Unused IOB Pins这一项改为Pull Up,单击OK。在界面的左下角双击【 Generate Programing File】,软件将自动对整个系统进行编译并生成可执行文件FRYALL.bit。将弹出的对话框关掉,双击【 Generate Prom, ACE,or JTAG File】在弹出的对话框中点击Finish,在随后出现的对话框中选择FRYALL.bit,然后点击打开,在随后的对话框中点击Bypass。右键单击左边图标选择Program,在随后的对话框中单击OK,文件将自动下载到开发板上,成功后,接入函数发生器进行测试。
四、测试结果及结论
经过了前三步,最后我们将所完成的工程下载到了板子上,连接好函数发生器,并设定好了函数发生器的输出信号电平(5Vpp),就可以进行使用了。
最后结果显示程序工作正常,读数清晰稳定,完全符合开始时的要求。
误差分析:
我将函数发生器的频率调节到999,999HZ时,频率计不显示,即产生了计数溢出,然后我进行了进一步的调节,将函数发生器的频率调节到999,997时读书显示为999.999,单位为KHZ。由此可知相对误差为±0.0002%,误差很小。所以本次实验圆满成功。
通过对数字频率计的设计实现,我深入的学习了ise软件的使用,VHDL语言的编写规范,语法结构等。在本次试验中我回顾了在《数字电路》课程中学过的关于数字电路的设计的部分,了解了VHDL和Verilog语言的区别与联系,以及它们的优缺点,以及它们主要针对的设计对象。我觉得我通过本次试验学会了很多。
第三篇:verilog简易数字频率计报告
一、实验原理
根据原理图,将计数器模块、显示模块、扫描模块、译码器模块等分别做出。其原理是在1S内用待测信号给计数器计数,并在一秒结束时给计数器清零,计出来用缓存器缓存,在数码管中显示出来。
二、方案论证
一、通过50M的时钟进行计数获得精密的1HZ——计数器用Verilog HDL语言实现在1HZ为底电平时计数——门控电路用或门开启——1HZ为高电平时进行数据锁存与显示——利用Verilog HDL语言使前面的0不显示。
计数器用Verilog HDL语言在写代码时可以用复制粘贴的方法可以简便的实现。通过50M的时钟进行计数获得精密的1HZ后只是经过很短的时间内进行计数器的清零及数据的琐存,并且得到的是1HZ的精密时钟。把锁存的数据进行清0的转换后利用分时扫描,后通过数码管译码显示。
说明:
Cnt9999:0000~9999计数器; Buffer:锁存器; Scan:扫描显示 共8个模块
三、实验步骤
一、计数器模块 计数器模块的仿真波形
二、锁存模块
利用32位的D触发器进行储存计数器送给它的数据。在时钟为上升沿的时候触发保存数据。锁存模块的源代码:
module buffer_32(clr,clear,in,out);input
clear,clr;input[31:0] in;output[31:0] out;reg[31:0]
out;always@(posedge clear or negedge clr)
if(!clr)out<=0;
//else if(clear)out=in;
else out<=in;
endmodule
三、转化清零模块 波形仿真波形
module cnt9999(clr,clk,q,c);
input clr,clk;output c;output [15:0]q;reg c;reg [15:0]q;
always @(posedge clk or negedge clr)begin
if(!clr)begin q[15:0]<=0;c<=1'b0;end
else if(q[15:0]==16'H9999)begin q[15:0]<=0;c<=1'b1;end
else if(q[11:0]==12'H999)begin q[15:0]<=q[15:0]+12'H667;c<=1'b0;end
else if(q[7:0]== 8'H99)begin q[15:0]<=q[15:0]+8'H67;c<=1'b0;end
else if(q[3:0]== 4'H9)begin q[15:0]<=q[15:0]+4'H7;c<=1'b0;end
else begin q[15:0]<=q[15:0]+1'b1;c<=1'b0;end end endmodule
四、扫描显示模块
把存储的数据分别分给8个数码管,利用循环扫描即可显示出所要显示的数据。
扫描显示模块的仿真波形
module scan(clk,q);input clk;output [2:0]q;reg
[2:0]q;
always @(posedge clk)
begin
q=q+1;
end
endmodule
四、引脚分配
五、实验总结
频率就是信号在1s内发生相同变化的次数,简易频率计就是基于这个原理设计的。我们先产生一个低电平为1s,高电平为1/50M秒的周期信号clk,用该信号与待测信号相与作为计数器的输入时钟,并把clk的上升沿作为缓存器的开关,把clk的高电平作为计数器的清零信号,这样就能保证缓冲器中存放的始终是待测信号在一秒内的跳变次数,也即待测信号的频率。
实验的原理尽管很清楚,但真正看到实验现象还是经历了一番波折,在写8选1数据选择器的时候,定义模块端口时,由于疏忽,把四位位宽漏写成了1位,结果在数码管上显示的始终只有0和1两种数字。为了改正这个错误,我把程序的主要模块都检查了一遍,结果不管怎么改实验现象都没有出来,这让我郁闷了很长一段时间,原理明明是对的,为什么就没有效果呢?最后我把整个程序都打印出来,一行一行地检查,最后终于找到了症结所在,就是8选1数据选择器的位宽弄错了!经历了这次错误,让我明白了写程序还是不能大意,8选1数据选择器虽然简单,却因为位宽这个小小的错误让我浪费了很长的时间,检查错误时也因为其简单而没有认真对待。
第四篇:简易数字频率计(数字电路课程设计)
数字电路课程设计报告
1)设计题目
简易数字频率计
2)设计任务和要求
要求设计一个简易的数字频率计,测量给定信号的频率,并用十进制数字显示,具体指标为:
1)测量范围:1HZ—9.999KHZ,闸门时间1s;
HZ—99.99KHZ,闸门时间0.1s;
HZ—999.9KHZ,闸门时间10ms;
KHZ—9999KHZ,闸门时间1ms;
2)显示方式:四位十进制数
3)当被测信号的频率超出测量范围时,报警.3)原理电路和程序设计:
(1)整体电路
数显式频率计电路
(2)单元电路设计;
(a)时基电路
(b)放大逻辑电路
(c)计数、译码、驱动电路
(3)说明电路工作原理;
四位数字式频率计是由一个CD4017(包含一个计数器和一个译码器)组成逻辑电路,一个555组成时基电路,一个9014形成放大电路,四个CD40110(在图中是由四个74LS48、四个74LS194、四个74LS90组成)及数码管组成。
两个CD40110串联成一个四位数的十进制计数器,与非门U1A、U1B构成计数脉冲输入电路。当被测信号从U1A输入,经过U1A、U1B两级反相和整形后加至计数器U13的CP+,通过计数器的运算转换,将输入脉冲数转换为相应的数码显示笔段,通过数码管显示出来,范围是1—9。当输入第十个脉冲,就通过CO输入下一个CD40110的CP+,所以此四位计数器范围为1—9999。
其中U1A与非门是一个能够控制信号是否输入的计数电路闸门,当一个输入端输入的时基信号为高电平的时候,闸门打开,信号能够通过;否则不能通过。
时基电路555与R2、R3,R4、C3组成低频多谐振荡器,产生1HZ的秒时基脉冲,作为闸门控制信号。计数公式:来确定。
与非门U2A与CD4017组成门控电路,在测量时,当时基电路输出第一个时基脉冲并通过U2A反相后加至CD4017的CP,CD4017的2脚输出高电平从而使得闸门打开。1s后,时基电路送来第二个脉冲信号,CD4017的2脚变为低电平,闸门关闭,测量结束。数码管显示即为所测频率。当555第三个脉冲送过来的时候,电路保持间歇1S,第四个脉冲后高电平加至R,使计数器复位。为下一次计算准备。
(4)元件选择。
资
料
元
件
标号
封装
数量
芯片
CD40110
GK7491AG
陶瓷熔扁平
CD4017
62F2X6KE4
陶瓷熔扁平
74LS00
陶瓷熔扁平
74LS10
陶瓷熔扁平
NE555
K104G4
双列直插型号
显示器
七段共阴数码管
电阻
300Ω
1KΩ
5.1KΩ
10KΩ
100KΩ
1MΩ
10KΩ(滑动)
电容
1000PF
0.1μF
100μF
二极管
1N4148
发光LED
开关
单刀双掷
导线
导线
若干
三极管
9014
电源
12V直流电源
4)电路和程序调试过程与结果:
a)、设计逻辑流程:
b)、理论波形图:
c)、仿真波形图:
1)、时基电路
2)、未、已经过施密特的波形:
d)、误差分析:
本实验的误差来自多方面的原因:一、时基电路NE555的滑动变阻器调节导致误差;二、闸门开放时间与信号输入时间的冲突导致测量不准确;三、整体电路的阻抗、容抗对电路信号的影响。
对于第一点,先计算相关的滑动变阻器的相应阻值大小,然后可以在关闭电源的情况下用万用表测量后才进行测量;第二点有点系统的偶然性;第三点可以尽量减少电路布局,从而减少相应的影响。
5)总结
这个电路多处使用了集成IC芯片,让电路更加简洁明了,并且提高了电路的安全性、可行性,减少了整个电路的功耗和整个电路的布线。但是此电路没有完全地符合实验要求:首先,整个电路没有施密特触发器,输入信号放大电路,数码管的小数点驱动,满位报警电路。因此我首先加入以三极管9014为核心的放大电路;然后用74LS00两个双输入与非门构成施密特触发器,对输入信号进行整形;对于报警电路,由于集成IC没有译码电路引脚,所以选择了一个8输入与非门和一个74LS00结成,这样可以充分考虑到唯一性;还有就是它的计数不是直接显示频率,而是显示一个数字,再与闸门的时候计算才可以得出真正的频率。
总体来说,电路还是存在一点小问题没有得到很好的解决,因为74LS00组成的施密特触发器没有很好地整形波,在示波器上出现脉冲波,还得于计算,可以改为以NE555组成的施密特电路。改用其他的数码管驱动,从而驱动小数点。
通过这次实验,让我认识到数字电路的万千变化,集成IC的推出,大大提高安全性和可行性。理解了科学就是力量。最主要是学习到设计电路的思想以为加强自己的焊接能力。让自己的电子技术更上一层楼。
附录:完整的电路PCB图,完整的源程序名列表(不需要把源程序打印出来,作为电子文档提交)。
附录一:
附录二:
第五篇:简易数字频率计设计报告
EDA技术基础 简易数字频率计 必做实验
电子信息科学与技术
物电学院
2011-06-24 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
简易数字频率计
一.实验要求
用Verilog硬件描述语言设计一个时序逻辑电路,能够对输入的TTL信号进行1s时长计数,将计数结果在数码管上显示,让该电路循环运行,则数码管显示的就是输入信号的频率。
用标准DDS信号发生器输入TTL信号,测试信号的频率与DDS输出设定的频率比较,分析误差以及误差产生的原因。
显示效果好,无闪烁,高位零不显示。
二.方案原理图
总体框图:
三、主要部分原理说明及实验步骤
根据原理图,先把计数器模块、显示模块、扫描模块分别做出。对于计数器模块因为要实现00000000~99999999的计数器,所以要用32bit,即要用
32第2页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
个D触发器。从而要用8个数码管进行循环扫描显示。对于1HZ的精密脉冲在低电平时,一方面和被测脉冲通过或门,当被测脉冲为高电平时门电路开启,另一方面通过一个非门把计数器的清零端置1,计数器正常工作开始计数。高电平时对计数器清零的同时,把测得的数据送入BUFFER中进行显示锁存。数码管的扫描时钟由外部提供。在此基础上把前面的0清除。
1、我在该设计中使用了一个或门作为门控电路,当输入时钟clka为低电平时,被测信号clk通过,当输入时钟clka为高电平时,被测信号被阻止。从clka端输入的是一个24M的脉冲,经过1HZ模块处理后生成一秒赫兹信号(如下图)
由这个信号来控制99999999计数器的清零和buffer中数据的更新以及被测信号的通过与阻止
其verilog语言代码如下 module clk_1hz(clk,clked);input clk;output clked;reg clked;reg[31:0]jishu;always @(posedge clk)begin if(jishu==24000000)begin jishu=0;clked=1;end else begin jishu=jishu+1;clked=0;end end endmodule
2、门控电路部分
其verilog语言代码如下
第3页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
module mynot(clk_1hz,nclk_1hz);input clk_1hz;output nclk_1hz;assign nclk_1hz=!clk_1hz;endmodule
99999999计数器计数在到达1S的瞬间,1HZ时钟出现上升沿,控制缓存器将此时的计数值锁存起来,然后送出显示。很短一段时间后,1HZ时钟恢复低电平,在这很短的时间内1HZ时钟经非门也完成了计数器的清零,之后计数器又恢复计数状态,进入下一秒的计数。
其verilog语言代码如下 module mynot(clk_1hz,nclk_1hz);input clk_1hz;output nclk_1hz;assign nclk_1hz=!clk_1hz;endmodule
3、计数模块
第4页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
99999999计数器是本次实验的关键所在,它的主要功能是:在1hz精密时钟和门控电路的控制下,在1s的时间内,对输入信号进行计数,1s后,由于门控电路的存在,计数器停止计数 其verilog语言代码如下 module cnt99999999(clr,clk,q);input clr,clk;output [31:0]q;reg [31:0]q;always @(posedge clk or negedge clr)begin if(!clr)q[31:0]=0;else if(q[31:0]==31'H99999999)q[31:0]=q[31:0]+32'H66666667;else if(q[27:0]==27'H9999999)q[31:0]=q[31:0]+28'H6666667;else if(q[23:0]==24'H999999)
q[31:0]=q[31:0]+24'H666667;else if(q[19:0]==20'H99999)
q[31:0]=q[31:0]+20'H66667;else if(q[15:0]==16'H9999)
q[31:0]=q[31:0]+16'H6667;else if(q[11:0]==12'H999)
q[31:0]=q[31:0]+12'H667;else if(q[ 7:0]== 8'H99)
q[31:0]=q[31:0]+8'H67;else if(q[ 3:0]== 4'H9)
q[31:0]=q[31:0]+4'H7;else q[31:0]=q[31:0]+1;end endmodule
4、显示数据缓冲buffer的设计
数据缓冲buffer的功能是当用计数器对输入信号计数,这些数据都暂时存在这个里面,每当时钟的上升沿到来的时候,它就向后面的模块输送数据,这样就可以得到相对稳定的显示。
第5页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
其verilog语言代码如下
module buff(in,clk,n1,n2,n3,n4,n5,n6,n7,n8);input clk;input [31:0]in;output [3:0]n1,n2,n3,n4,n5,n6,n7,n8;reg [3:0]n1,n2,n3,n4,n5,n6,n7,n8;
always @(posedge clk)begin begin n1=in[3:0];n2=in[7:4];n3=in[11:8];n4=in[15:12];n5=in[19:16];n6=in[23:20];n7=in[27:24];n8=in[31:28];end end endmodule
5、显示部分
由于要用到8个数码管对实验结果进行显示,我们可以设计一个译码模块:
其verilog语言代码如下 module yima(in,a,b,c,d,e,f,g,dp);input
[3:0]in;output a,b,c,d,e,f,g,dp;reg
a,b,c,d,e,f,g,dp;always @(in)begin case(in)
第6页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
4'b0000:{dp,g,f,e,d,c,b,a}=8'b00111111;4'b0001:{dp,g,f,e,d,c,b,a}=8'b00000110;4'b0010:{dp,g,f,e,d,c,b,a}=8'b01011011;4'b0011:{dp,g,f,e,d,c,b,a}=8'b01001111;4'b0100:{dp,g,f,e,d,c,b,a}=8'b01100110;4'b0101:{dp,g,f,e,d,c,b,a}=8'b01101101;4'b0110:{dp,g,f,e,d,c,b,a}=8'b01111101;4'b0111:{dp,g,f,e,d,c,b,a}=8'b00000111;4'b1000:{dp,g,f,e,d,c,b,a}=8'b01111111;4'b1001:{dp,g,f,e,d,c,b,a}=8'b01101111;default:{dp,g,f,e,d,c,b,a}=8'b01000000;endcase end endmodule 部分引脚功能的排列如下图所示
数码管的引脚排列 以上5部分就是顶层原理图的主要部分
四、实验总结
1、要用1HZ的精确时钟不能直接接一个外接的信号源,这样的误差太大,只能将一个标准的24M的时钟进行24分频,才能的到相对稳定的时钟信号。
2、数据缓冲部分不能少,如果没有这部分,将得不到想要的结果,数码管上会出现一排乱跳的数字。
3、在整个实验设计过程中,我发现只要弄清楚所需要的几个模块,然后将模块分开来进行生成,设计也并不是想象中的那么难。
第7页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
4、在此程序设计中,对各个模块的功能有针对性的设计思路有了一定的提高,对于一个程序的需要哪些功能模块,需要什么样的输入输出,都比以前有了一定的提高。
5、学EDA已经有一学期了,现在对那些原理框图并不陌生了,现在也可以写一些简单的代码。我发现只要我们认真的去学习,虚心的的去请教他人,我们谁都可以把这门课学好。虽然在学习这门课以及做实验的过程中,我们往往会遇到种种困难,但是当实验结果与现象出来的那一刹那,我们就会感受那成功的快乐。
第8页,共8页