📄 频率计2.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 + -