基于VHDL语言的频率计设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
一、课程设计任务: (2)
二、课程设计原理: (2)
三、课程设计所需仪器: (2)
四、课程设计使用的硬件资源及原理框图: (2)
五、设计过程及操作: (3)
1、FTCTRL测频控制模块: (3)
2、计数器模块: (3)
3、REG32B锁存器模块 (3)
4、DECL7S译码器模块 (4)
5、分频器模块 (4)
6、MUX多路选择器模块。

(4)
7、器件连接: (4)
8、操作过程: (4)
六、设计各个模块代码: (5)
1:FTCTRL模块 (5)
2:CNT_10计数器模块 (5)
3:REG32B锁存器模块 (6)
4:DECL7S译码器模块 (6)
5:any_10 10分频器模块 (7)
6:any_5 5分频器模块 (7)
7:any_16 16分频模块 (8)
8:MUX多路选择器模块 (9)
9:顶层例化代码 (9)
七、总电路: (12)
八、管脚配置: (13)
九、设计结果: (14)
设计8位十进制频率计
二、课程设计原理:
根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉宽为1秒的对输入信号脉冲计数允许的信号;1秒计数结束后,计数值锁入锁存器的锁存信号和为下一测频计数周期作准备的计数器清0信号。

这清0个信号可以由一个测频控制信号发生器TESTCTL 产生,它的设计要,TESTCTL的计数使能信号CNT_EN能产生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT10的EN使能端进行同步控制。

当CNT_EN高电平时,允许计数;低电平时停止计数,并保持其所计的脉冲数。

在停止计数期间,首先需要一个锁存信号LOAD 的上跳沿将计数器在前1秒钟的计数值锁存进各锁存器REG4B中,并由外部的7段译码器译出,显示计数值。

设置锁存器的好处是,显示的数据稳定,不会由于周期性的清零信号而不断闪烁。

锁存信号之后,必须有一清零信号RST_CNT对计数器进行清零,为下1秒钟的计数操作作准备。

三、课程设计所需仪器:
Altrea DE2-115实验箱;quartusII 12.1;modelsim仿真软件。

四、课程设计使用的硬件资源及原理框图:
1、50MHz时钟源两个
2、拨动开关
3、7段数码管/液晶显示屏
1、FTCTRL测频控制模块:
频率计的核心控制部分为FTCTRL,该模块的技术是能信号CNT_EN能产生一个1s脉宽的周期信号(由于实验箱提供的是50MHz的高频信号,所以需要通过分频器获得1s脉宽信号),并对频率计中的计数器的EN使能端进行同步测控。

当CNT_EN高电平时允许计数;低电平时停止计数,并保持其所设计的脉冲数。

在停止计数期间,首先需要一个锁存信号LOAD的上升沿将计数器在前一秒钟的计数器的计数值锁存进锁存器REG32B中,并由外部的十六进制7段译码器译出,显示计数值。

锁存信号后,必须有一清零信号RST_CNT对计数器清零,为下一秒的计数操作做准备。

2、计数器模块:
由于设计要求为8位十进制输出,所以采用的是十进制加法带进位的计数器级联的形式完成计数功能,每个单独的计数器有4位的十进制DOUT(3 DOWNTO 0)输出和一个进位COUT输出,输入的RST复位端、EN使能端和计数信号CLK端。

级联时,将被测信号接入第一个各位的CNT_10计数器的CLK端,并且将每上一个的进位端与下一个的计数器CNT_10的计数CLK相连。

3、REG32B锁存器模块
锁存器为32位,包括一个锁存信号LK,32位的输入和输出。

4、DECL7S译码器模块
因为每个计数器输出的是二进制数,所以转化到七段数码管上需要通过4-7译码器译码。

实验箱的数码管为共阳极。

需要8个数码管同时显示,所以需要8个译码器。

5、分频器模块
由于实验箱只提供50MHz的信号,所以需要分频得到1Hz的信号以及不同的频率进行测试,所以需要分频器。

本设计分频器采用的是5分频器any_5、10分频器any_10和16分频器any_16。

6、MUX多路选择器模块。

由于实验箱提供的信号源有限,所以要进行测试,必须使用多路选择器来进行对不同的分频信号进行测试来验证频率计的功能是否完成。

本次设计采用的是4选1多路选择器。

7、器件连接:
以上各部份器件已经完善。

需要将这些器件连接起来完成最终的设计,所以本次设计采取了元件例化,用例化语句将各个器件连接起来。

顶层文件见代码段。

8、操作过程:
A建立项目
B选择器件:
器件系列(Device Family) Cyclone IV E
器件型号(Available Devices) EP4CE115F29C7
C建立设计文档,new vhdl file,并编辑保存。

D点击按键栏(或Processing菜单中)的Start compilation 进行编译
E编译正确完成后,点击按键栏(或Assignments菜单中)的Pin Planner进行引脚锁定F双击Location栏,在下拉菜单中选择需要锁定的引脚(EP4C115F芯片引脚分布详见附录)
G再次编译项目
H连接实验箱
I 程序下载
点击按键栏(或T ools菜单)的Programmer,此时没有添加硬件,点击Hardware Setup选择硬件。

在Currently selected hardware下拉菜单中选择USB-Blaster后,点击Close,回到Programmer页面。

在Hardware Setup栏中可看到USB-Blaster。

注意Mode 为缺省的JTAG接口硬件选择完毕。

点击Start开始下载。

Progress进度完成后下载完毕。

六、设计各个模块代码:
1:FTCTRL模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY FTCTRL IS
PORT ( CLKK :IN STD_LOGIC;
CNT_EN,RST_CNT :OUT STD_LOGIC;
LOAD: OUT STD_LOGIC );
END FTCTRL;
ARCHITECTURE behav of FTCTRL IS
SIGNAL DIV2CLK :STD_LOGIC :='0';
BEGIN
PROCESS (CLKK) BEGIN
IF CLKK 'EVENT AND CLKK='1' THEN 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;
2:CNT_10计数器模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT10 IS
PORT( RST ,EN,CLK: IN STD_LOGIC;
COUT :OUT STD_LOGIC;
DOUT :OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END CNT10;
ARCHITECTURE BHV OF CNT10 IS
BEGIN
PROCESS(CLK,RST,EN)
VARIABLE Q1 :STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF RST='1' THEN Q1:=( OTHERS =>'0');
ELSIF CLK'EVENT AND CLK='1' THEN
IF EN='1' THEN
IF Q1<9 THEN Q1:=Q1+1;
ELSE Q1:=(OTHERS=>'0');
END IF;
END IF;
END IF;
IF Q1="1001" THEN COUT<='0';
ELSE COUT<='1';END IF;
DOUT <= Q1;
END PROCESS;
END BHV;
3:REG32B锁存器模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY REG32B IS
PORT(LK:IN STD_LOGIC;
DIN:IN STD_LOGIC_VECTOR(31 DOWNTO 0);
Q:OUT STD_LOGIC_VECTOR(31 DOWNTO 0)); END;
ARCHITECTURE BHV OF REG32B IS
BEGIN
PROCESS(LK,DIN) BEGIN
IF LK 'EVENT AND LK='1' THEN Q <=DIN; END IF;
END PROCESS;
END BHV;
4:DECL7S译码器模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY DECL7S IS
PORT ( A :IN STD_LOGIC_VECTOR (3 DOWNTO 0);
LED7S: OUT STD_LOGIC_VECTOR (6 DOWNTO 0)); END;
ARCHITECTURE ONE OF DECL7S IS
BEGIN
PROCESS(A) BEGIN
CASE A IS
WHEN "0000" =>LED7S <="1000000"; WHEN "0001" =>LED7S <="1111001"; WHEN "0010" =>LED7S <="0100100"; WHEN "0011" =>LED7S <="0110000"; WHEN "0100" =>LED7S <="0011001"; WHEN "0101" =>LED7S <="0010010"; WHEN "0110" =>LED7S <="0000010"; WHEN "0111" =>LED7S <="1111000"; WHEN "1000" =>LED7S <="0000000"; WHEN "1001" =>LED7S <="0010000"; WHEN OTHERS => NULL;
END CASE;
END PROCESS;
END;
5:any_10 10分频器模块
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity any_10 is
port (clk10:in std_logic;
k:out std_logic);
end;
architecture bhv of any_10 is
signal s : std_logic;
signal c : std_logic_vector(3 downto 0); begin
process(clk10,c)begin
if rising_edge(clk10) then
if (c="1001") then c<="0000";
else c<=c+1;end if;
if (c="0101") then s<=not s;
elsif(c="0000") then s<=not s;end if;
end if;
end process;
k<=s;
end bhv;
6:any_5 5分频器模块
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ANY_5 is
port(clk5:in std_logic;
kf:out std_logic);
end;
architecture bhv of ANY_5 is
signal c1,c2: std_logic_vector(2 downto 0);
signal m1,m2: std_logic;
begin
process(clk5,c1)
begin
if rising_edge(clk5) then
if(c1="100") then c1<="000";
else c1<=c1+1;end if;
if(c1="001") then m1<=not m1;
elsif(c1="011") then m1<=not m1;end if; end if; end process;
process(clk5,c2) begin
if falling_edge(clk5) then
if(c2="100") then c2<="000";
else c2<=c2+1;end if;
if(c2="001") then m2<=not m2;
elsif(c2="011") then m2<=not m2;end if; end if; end process;
kf<=m1 or m2;
end bhv;
7:any_16 16分频模块
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity any_16 is
port( clk_in : in std_logic;
clk_out : out std_logic);
end entity any_16;
architecture div1 of any_16 is
signal clk_outQ : std_logic ;
signal coutQ : std_logic_vector (15 downto 0); begin
process(clk_in) begin
if clk_in'event and clk_in = '1' then
if coutQ <15
then coutQ <= coutQ + 1;
else coutQ <= (others => '0'); end if; end if;
end process;
process(coutQ) begin
if coutQ < 16/2
then clk_outQ <= '0';
else clk_outQ <= '1'; end if;
end process;
clk_out <= clk_outQ;
end architecture div1;
8:MUX多路选择器模块
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity MUX is
port(AIN,BIN,CIN,DIN,S0,S1 : in std_logic; Y : out std_logic); end entity MUX;
architecture A of MUX is
signal S : std_logic_vector (1 downto 0);
begin
S <= S1&S0;
process(S1,S0) begin
CASE(S) IS
WHEN "00" => Y<=AIN;
WHEN "01" => Y<=BIN;
WHEN "10" => Y<=CIN;
WHEN "11" => Y<=DIN;
END CASE;
end process;
end architecture A;
9:顶层例化代码
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY pinlvji IS
PORT( CLK,FFIN,S0,S1:IN STD_LOGIC;
QOUT:OUT STD_LOGIC_VECTOR(55 DOWNTO 0));
END ENTITY pinlvji;
ARCHITECTURE BHV OF pinlvji IS
COMPONENT FTCTRL
PORT ( CLKK :IN STD_LOGIC;
CNT_EN,RST_CNT :OUT STD_LOGIC;
LOAD: OUT STD_LOGIC );
END COMPONENT ;
COMPONENT REG32B
PORT( LK :IN STD_LOGIC;
DIN:IN STD_LOGIC_VECTOR(31 DOWNTO 0);
Q:OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END COMPONENT ;
COMPONENT CNT10
PORT( RST ,EN,CLK: IN STD_LOGIC;
COUT :OUT STD_LOGIC;
DOUT :OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END COMPONENT ;
COMPONENT DECL7S
PORT( A :IN STD_LOGIC_VECTOR (3 DOWNTO 0);
LED7S: OUT STD_LOGIC_VECTOR (6 DOWNTO 0));
END COMPONENT;
COMPONENT any_16
port(clk_in : in std_logic;
clk_out : out std_logic);
END COMPONENT;
COMPONENT any_5
port(clk5:in std_logic;
kf:out std_logic);
END COMPONENT;
COMPONENT any_10
port (clk10:in std_logic;
k:out std_logic);
END COMPONENT;
COMPONENT MUX
port(AIN,BIN,CIN,DIN,S0,S1 : in std_logic; Y : out std_logic); END COMPONENT;
SIGNAL NR,NE,NL,M1,M2,M3,M4,M5,M6,M7,M8:STD_LOGIC;
SIGNAL N1,N2,N3,N4,N5,N6,N7,N8:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL L1,L2,L3,L4,L5,L6,L7,L8:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL C1,C2,C3,C4,C5,C6,C7,C8:STD_LOGIC;
SIGNAL Y1,Y2,Y3,YY:STD_LOGIC;
BEGIN
U1:FTCTRL PORT MAP(CLKK=>C8,CNT_EN=>NE,RST_CNT=>NR,LOAD=>NL); U2:REG32B PORT MAP(LK=>NL,
DIN(3 DOWNTO 0)=>N1,DIN(7 DOWNTO 4)=>N2,
DIN(11 DOWNTO 8)=>N3,DIN(15 DOWNTO 12)=>N4,
DIN(19 DOWNTO 16)=>N5,DIN(23 DOWNTO 20)=>N6,
DIN(27 DOWNTO 24)=>N7,DIN(31 DOWNTO 28)=>N8,
Q(3 DOWNTO 0)=>L1,Q(7 DOWNTO 4)=>L2,
Q(11 DOWNTO 8)=>L3,Q(15 DOWNTO 12)=>L4,
Q(19 DOWNTO 16)=>L5,Q(23 DOWNTO 20)=>L6,
Q(27 DOWNTO 24)=>L7,Q(31 DOWNTO 28)=>L8);
U3:CNT10 PORT MAP(RST=>NR,EN=>NE,CLK=>YY,DOUT=>N1,COUT=>M1);- U4:CNT10 PORT MAP(RST=>NR,EN=>NE,CLK=>M1,DOUT=>N2,COUT=>M2); U5:CNT10 PORT MAP(RST=>NR,EN=>NE,CLK=>M2,DOUT=>N3,COUT=>M3); U6:CNT10 PORT MAP(RST=>NR,EN=>NE,CLK=>M3,DOUT=>N4,COUT=>M4); U7:CNT10 PORT MAP(RST=>NR,EN=>NE,CLK=>M4,DOUT=>N5,COUT=>M5); U8:CNT10 PORT MAP(RST=>NR,EN=>NE,CLK=>M5,DOUT=>N6,COUT=>M6); U9:CNT10 PORT MAP(RST=>NR,EN=>NE,CLK=>M6,DOUT=>N7,COUT=>M7); U10:CNT10 PORT MAP(RST=>NR,EN=>NE,CLK=>M7,DOUT=>N8);
U11:DECL7S PORT MAP(A => L1,LED7S=>QOUT(6 DOWNTO 0));
U12:DECL7S PORT MAP(A => L2,LED7S=>QOUT(13 DOWNTO 7));
U13:DECL7S PORT MAP(A => L3,LED7S=>QOUT(20 DOWNTO 14));
U14:DECL7S PORT MAP(A => L4,LED7S=>QOUT(27 DOWNTO 21));
U15:DECL7S PORT MAP(A => L5,LED7S=>QOUT(34 DOWNTO 28));
U16:DECL7S PORT MAP(A => L6,LED7S=>QOUT(41 DOWNTO 35));
U17:DECL7S PORT MAP(A => L7,LED7S=>QOUT(48 DOWNTO 42));
U18:DECL7S PORT MAP(A => L8,LED7S=>QOUT(55 DOWNTO 49));
U19:any_10 PORT MAP(CLK,C1);
U20:any_10 PORT MAP(C1,C2);
U21:any_10 PORT MAP(C2,C3);
U22:any_10 PORT MAP(C3,C4);
U23:any_10 PORT MAP(C4,C5);
U24:any_10 PORT MAP(C5,C6);
U25:any_10 PORT MAP(C6,C7);
U26:any_5 PORT MAP(C7,C8);
U27:MUX PORT MAP(Y1,Y2,Y3,FFIN,S0,S1,YY);
U28:any_5 PORT MAP(FFIN,Y1);
U29:any_16 PORT MAP(FFIN,Y2);
U30:any_10 PORT MAP(FFIN,Y3);
END ARCHITECTURE;
七、总电路:1
2
3
4
八、管脚配置:
CLOCK2_50 Input PIN_AG14 CLK CLOCK3_50 Input PIN_AG15 FFIN
HEX0[6] Output PIN_H22 QOUT[6] HEX0[5] Output PIN_J22 QOUT[5] HEX0[4] Output PIN_L25 QOUT[4] HEX0[3] Output PIN_L26 QOUT[3] HEX0[2] Output PIN_E17 QOUT[2] HEX0[1] Output PIN_F22 QOUT[1] HEX0[0] Output PIN_G18 QOUT[0] HEX1[6] Output PIN_U24 QOUT[13] HEX1[5] Output PIN_U23 QOUT[12] HEX1[4] Output PIN_W25 QOUT[11] HEX1[3] Output PIN_W22 QOUT[10] HEX1[2] Output PIN_W21 QOUT[9] HEX1[1] Output PIN_Y22 QOUT[8] HEX1[0] Output PIN_M24 QOUT[7] HEX2[6] Output PIN_W28 QOUT[20] HEX2[5] Output PIN_W27 QOUT[19] HEX2[4] Output PIN_Y26 QOUT[18] HEX2[3] Output PIN_W26 QOUT[17] HEX2[2] Output PIN_Y25 QOUT[16] HEX2[1] Output PIN_AA26 QOUT[15] HEX2[0] Output PIN_AA25 QOUT[14] HEX3[6] Output PIN_Y19 QOUT[27] HEX3[5] Output PIN_AF23 QOUT[26] HEX3[4] Output PIN_AD24 QOUT[25] HEX3[3] Output PIN_AA21 QOUT[24] HEX3[2] Output PIN_AB20 QOUT[23] HEX3[1] Output PIN_U21 QOUT[22] HEX3[0] Output PIN_V21 QOUT[21] HEX4[6] Output PIN_AE18 QOUT[34] HEX4[5] Output PIN_AF19 QOUT[33] HEX4[4] Output PIN_AE19 QOUT[32] HEX4[3] Output PIN_AH21 QOUT[31] HEX4[2] Output PIN_AG21 QOUT[30] HEX4[1] Output PIN_AA19 QOUT[29] HEX4[0] Output PIN_AB19 QOUT[28] HEX5[6] Output PIN_AH18 QOUT[41] HEX5[5] Output PIN_AF18 QOUT[40] HEX5[4] Output PIN_AG19 QOUT[39] HEX5[3] Output PIN_AH19 QOUT[38] HEX5[2] Output PIN_AB18 QOUT[37] HEX5[1] Output PIN_AC18 QOUT[36] HEX5[0] Output PIN_AD18 QOUT[35] HEX6[6] Output PIN_AC17 QOUT[48] HEX6[5] Output PIN_AA15 QOUT[47] HEX6[4] Output PIN_AB15 QOUT[46] HEX6[3] Output PIN_AB17 QOUT[45] HEX6[2] Output PIN_AA16 QOUT[44] HEX6[1] Output PIN_AB16 QOUT[43] HEX6[0] Output PIN_AA17 QOUT[42] HEX7[6] Output PIN_AA14 QOUT[55] HEX7[5] Output PIN_AG18 QOUT[54] HEX7[4] Output PIN_AF17 QOUT[53] HEX7[3] Output PIN_AH17 QOUT[52] HEX7[2] Output PIN_AG17 QOUT[51] HEX7[1] Output PIN_AE17 QOUT[50] HEX7[0] Output PIN_AD17 QOUT[49] SW[17] Input PIN_Y23 S0
SW[16] Input PIN_Y24 S1
九、设计结果:
50MHz信号10分频
50MHz信号16分频
50Mhz信号。

相关文档
最新文档