⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 频率计2.txt

📁 这是eda初学者可以借鉴的两个关于电子频率计的VHDL设计实例
💻 TXT
字号:
频率计


1.        设计一个4位十进制频率计,其测量范围为1MHz。量程分10kHz、100kHz、1MHz、10Mhz四档(最大读数分别为9.999kHz、99.99kHz、999.9kHz、9999khz),量程自动转换规则如下:
(1)        当读数大于9999时,频率计处于超量程状态,下一次测量时,量程自动增大一档。
(2)        当读数小于0999时,频率计处于欠量程状态。下一次测量时,量程自动增大一档。
2.        显示方式如下:
(1)        采用记忆显示方式,即计数过程中不显示数据,待计数过程结束后,显示计数结果,并将此显示结果保持到下一次计数结束。显示时间应不小于1s。
(2)        小数点位置随量程变换自动移位。
3.        送入信号应是符合CMOS电路要求的脉冲或正弦波。
4.        设计符合上述功能的频率计,并用层次化方法设计该电路。
5.        控制器、计数器、锁存器的功能,用功能仿真方法验证,还可通过观察有关波形确认电路设计是否正确。
6.        完成电路设计后在实验系统上下载,验证课题的正确性。

二、设计说明与提示
    频率计测频原理框图如图17-1所示。

                         fin

                           clr
                                               count
                           en
   clk                                                            led
                                        choice
                         
                                              counts

                           load
                           
                                            clk1024

                              图17-1 频率计测频原理图
1.        信号说明:
clk:时钟信号(1HZ)
fin:输入频率信号;最高可测频率为9.999MHZ;
clr:清零信号;
en:计数使能信号;
count:计数输出信号
counts:计数输出经锁存的信号
led:显示输出,四个十进制数
choice:控制量程的信号,00代表10khz档;01代表100khz档;10代表1Mhz档;11代表10Mhz档;
load:输出锁存;
clk1024:动态扫描模块的扫描频率
2.        模块功能:
控制模块:
每次测量时,用由时基信号产生的闸门信号启动计数器,对输入脉冲信号计数,闸门信号结束即将计数结果送入锁存器,然后计数器清零,准备下一次计数。
计数模块:
计数器为模9999十进制加法计数器,可由4个模10十进计数器级联而成。并且可由量程选择信号控制模9999计数器的基本频率(比如100khz档的基本频率为10hz,即输入10个脉冲时模9999计数器计1)
量程转换模块:
1)当读数大于9999时,频率计处于超量程状态,此时显示器发出溢出指示(最高位显示F,其余各位不显示数字),下一次测量时,量程自动增大一档。
2)        当读数小于0999时,频率计处于欠量程状态。下一次测量时,量程自动增大一档。
动态扫描模块:
1.        带锁存功能。
2.        显示电路为四位动态扫描电路,。
程序设计说明:
控制模块:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY control IS
        PORT(
                clk                        : IN        STD_LOGIC;
                en,clr,load        : OUT        STD_LOGIC);
END control;
ARCHITECTURE a OF control IS
SIGNAL eninside : STD_LOGIC;
BEGIN
en<=eninside;                        --en计数使能信号宽度为一秒
load<= NOT eninside;        ――使能结束后发出锁存信号
clr<=(NOT clk) AND (NOT eninside); ――锁存信号发出0.5s后发出清零信号
controllabel:
PROCESS (clk)                ――输入时钟周期为1s
BEGIN
IF clk'event AND clk='1' THEN
    eninside<=not eninside;
END IF;
END PROCESS controllabel;
END a;
计数模块:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY countmode IS
        PORT(
                fin,en,clr                        : IN        STD_LOGIC;
                choice                                : IN    STD_LOGIC_VECTOR(1 DOWNTO 0);
                count                                : BUFFER        STD_LOGIC_VECTOR(15 DOWNTO 0));
END countmode;
ARCHITECTURE a OF countmode IS
        SIGNAL finclk        : STD_LOGIC;        ――不同量程时的驱动时钟(不包括直接输入时钟)
SIGNAL finclks        : STD_LOGIC;――不同量程时的驱动时钟
        SIGNAL choicecount        : STD_LOGIC_VECTOR(8 DOWNTO 0);――不同驱动时钟的计数
SIGNAL choicechange        : STD_LOGIC_VECTOR(8 DOWNTO 0);――不同量程驱动时钟的计数
BEGIN
choicechange<="000000100" WHEN choice="01" ELSE  --99.99kHz档的驱动时钟每10个脉冲为一次跳变周期,故每计数到4时跳变一次,可以实现相应跳变周期。
                          "000110001" WHEN choice="10" ELSE ――999.9kHz档类上述计数49次跳变一次
                          "111110011"; ――9999kHz档,每499次跳变一次
modelabel:
PROCESS (fin,en,clr) ――经过第一次处理得出驱动计数器的驱动频率finclk
BEGIN
IF clr='1' THEN 
choicecount<="000000000";
finclk<='0';
ELSIF fin'event AND fin='1' THEN
    IF en='1' THEN choicecount<=choicecount+1; END IF;
        IF choicecount=choicechange THEN choicecount<="000000000";finclk<=NOT finclk;END IF;
END IF;
END PROCESS modelabel;
finclks<=(NOT fin) WHEN choice="00" ELSE finclk;――加入直接驱动模式
countmodelabel:
PROCESS (finclks,en,clr)
VARIABLE countinside        : STD_LOGIC_VECTOR(15 DOWNTO 0);
BEGIN
IF clr='1' THEN 
countinside:="0000000000000000";
ELSIF finclks'event AND finclks='0' THEN
    IF en='1' THEN countinside:=countinside+1;END IF;
        IF countinside(3 DOWNTO 0)=10 THEN countinside:=countinside+6;END IF;――进制处理
        IF countinside(7 DOWNTO 4)=10 THEN countinside:=countinside+"01100000";END IF;
        IF countinside(11 DOWNTO 8)=10 THEN countinside:=countinside+"011000000000";END IF;
END IF;
count<=countinside;
END PROCESS countmodelabel;
END a;
量程转换模块:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY change IS
        PORT(
                clr                                : IN        STD_LOGIC;
                counts                        : IN        STD_LOGIC_VECTOR(3 DOWNTO 0);
                choice        : OUT        STD_LOGIC_VECTOR(1 DOWNTO 0));
END change;
ARCHITECTURE a OF change IS
SIGNAL up,down,change : STD_LOGIC;
BEGIN
up<='1' WHEN (counts > "1001") AND clr='1' ELSE '0';――超量程状态,产生提档信号
down<='1' WHEN (counts = "0000") AND clr='1' ELSE '0';――欠量程时,产生降档信号
change<=up OR down;――变量程信号
controllabel:
PROCESS (change)
VARIABLE choicein        : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
IF change'event AND change='1' THEN
    IF up='1' AND (not (choicein="11")) THEN choicein:=choicein+1;
    ELSIF down='1' AND (not (choicein="00")) THEN choicein:=choicein-1;END IF;
END IF;  ――产生量程选择信号
choice<=choicein;
END PROCESS controllabel;
END a;
扫描转换模块:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
ENTITY sao IS
        PORT(
                load,clk        : IN        STD_LOGIC;
                countin                : IN        STD_LOGIC_VECTOR(15 downto 0);
                choiceshow        : IN        STD_LOGIC_VECTOR(1 downto 0);
                counts                : OUT        STD_LOGIC_VECTOR(3 downto 0);
                choice                : OUT        STD_LOGIC_VECTOR(3 downto 0);
                data                : OUT        STD_LOGIC_VECTOR(7 downto 0));
END sao;
ARCHITECTURE a OF sao IS
        SIGNAL dot                                          : STD_LOGIC;
        SIGNAL count                                  : STD_LOGIC_VECTOR(1 downto 0);
        SIGNAL temp,p4,p3,p2,p1                 : STD_LOGIC_VECTOR(3 downto 0);
        SIGNAL choicein                      : STD_LOGIC_VECTOR(3 downto 0);
        SIGNAL datain                         : STD_LOGIC_VECTOR(7 downto 0);
BEGIN
clklabel:
PROCESS (load)  ――锁存显示数值
BEGIN
IF load'event and load='1' THEN
    counts<=countin(15 downto 12);
        p4<=countin(15 downto 12);
        p3<=countin(11 downto 8);
        p2<=countin(7 downto 4);
        p1<=countin(3 downto 0);
END IF;
END PROCESS clklabel;
clk1_label:
PROCESS (clk)  ――扫描时钟
BEGIN
IF clk'event and clk='1' THEN
    count<=count+1;
END IF;
END PROCESS clk1_label;
dot<='1' WHEN choiceshow=count ELSE '0'; ――由选择信号决定小数点的显示
clk2_label:
PROCESS (clk)
BEGIN
if clk'event and clk='0' then
   choice<=choicein;   ――显示当前扫描位置
   data<=datain(7 DOWNTO 1) & dot; ――显示当前显示数值
END IF;
END PROCESS clk2_label;
choicein<="0001" when count="00" else  ――扫描位置转换
                "0010" when count="01" else
                "0100" when count="10" else
                "1000" ;
temp<=        p1 when count="00" else   ――显示数值选择
                p2 when count="01" else
                p3 when count="10" else
                p4 ;
WITH temp select
        datain  <= "11111100" WHEN "0000",  ――数值转换成数码管的相应输入信号
                           "01100000" WHEN "0001",
                           "11011010" WHEN "0010",
                           "11110010" WHEN "0011",
                           "01100110" WHEN "0100",
                           "10110110" WHEN "0101",
                           "10111110" WHEN "0110",
                           "11100000" WHEN "0111",
                           "11111110" WHEN "1000",
                           "11110110" WHEN "1001",
                           "11101110" WHEN "1010",
                           "00111110" WHEN "1011",
                           "10011100" WHEN "1100",
                           "01111010" WHEN "1101",
                           "10011110" WHEN "1110",
                           "10001110" WHEN OTHERS;
END a;
三、实验报告要求
1.        画出顶层原理图。
2.        对照频率计波形图分析电路工作原理。
3.        写出各功能模块的VHDL语言源文件。
4.        叙述各模块的工作原理。
5.        祥述控制器的工作原理,绘出完整的电路或写出VHDL源文件。
6.        书写实验报告时应结构合理,层次分明,在分析时注意语言的流畅。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -