多功能计数器课程设计

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

1、题目及内容要求
题目:多功能计数器:
内容要求:设计一个20进制多功能计数器,实现从0~19连续变化和0~38偶数变化的递增与递减功能,两位数码管显示计数值。

2、设计思路
使用KHF—3型CPLD/FPGA实验开发系统,因为系统无法提供秒脉冲,故选用10MHz 的方波时钟源,对其进行分频,使之产生占空比为50%的1Hz的方波时钟源作为计数器的时钟输入。

将整个计数器分个三模块进行设计:1Hz方波时钟源模块(clkdiv)、可逆计数模块(CNT)和两位七段译码器模块(seg7),先将各模块的程序设计出来,编译并仿真通过后,用例化语句实现三个模块的连接,再进行编译与仿真,就能实现该多功能计数器的设计要求。

系统的逻辑功能可用下面的框图表示出来:
系统方框图
3、设计方案
3.1、1Hz方波时钟源模块(clkdiv)
选用10MHz的方波时钟源,对脉冲进行计时,当计满5M个时钟脉冲时,对输出端口进行取反,即可获得1Hz的时钟脉冲源。

脉冲的计算:100×100×100×5=5000000(5M)
程序中clk为10MHz时钟信号输入端口,clk_div为分频时钟信号输出端口,clk与clk_div 都为一位二进制数。

因为软件与计算机功能限制,无法对其进行仿真与波形输出,只能通过在编译后,下载到器件上进行验证。

1Hz方波时钟源源程序及注释如下:
LIBRARY IEEE;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY clkdiv IS
PORT(clk:IN STD_LOGIC;
clk_div:BUFFER STD_LOGIC );
END ENTITY clkdiv;
ARCHITECTURE one OF clkdiv IS
SIGNAL clk_div2,clk_div4,clk_div6,clk_div7:STD_LOGIC_VECTOR(6 DOWNTO 0); BEGIN
PROCESS(clk)
BEGIN
IF clk'EVENT AND clk='1'THEN
IF clk_div2="1100011" THEN clk_div2<=(OTHERS=>'0');
ELSE clk_div2<=clk_div2+1;
END IF; --计算100个脉冲;
IF clk_div2="1100011" THEN clk_div4<=clk_div4+1;
ELSIF clk_div4="1100011" THEN clk_div4<="0000000";
END IF; --计算10000个脉冲;
IF clk_div4="1100011" THEN clk_div6<=clk_div6+1;
ELSIF clk_div6="1100011" THEN clk_div6<="0000000";
END IF; --计算1000000个脉冲; IF clk_div6="1100011" THEN clk_div7<=clk_div7+1;
ELSIF clk_div7="0000101" THEN clk_div7<="0000000"; --计算5000000个脉冲; clk_div<=NOT clk_div; --对输出进行取反; END IF;
END IF;
END PROCESS;
END;
3.2、可逆计数模块(CNT)
将整个模块再分成四个单元模块:0~19递增单元模块、0~38递增单元模块、19~0递减单元模块和38~0递减单元模块,再设计一个控制端,利用不同的状态对四个单元模块进行选择,以实现四种计数的切换选择,实现多功能计数的要求。

在源程序中,将分频后的1Hz时钟源作为脉冲输入,sel为两位二进制输入使能端,有两个四位二进制数端出端口,其中data_out0为个位数输出,data_out1为十位数输出,利用IF 语句的嵌套对四种功能模块进行判断选择。

利用使能端sel的控制输出四种状态实现0~19连续变化递增模块、0~38偶数变化递增模块、19~0连续变化递减模块、38~0偶数变化递减模块的切换选择如下表所示:
可逆计数模块(CNT)源程序及注释如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT IS
PORT(clk_div_s:IN STD_LOGIC;
sel:IN STD_LOGIC_VECTOR(1 DOWNTO 0);
data_out0,data_out1 :BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0));
END ENTITY CNT;
ARCHITECTURE one OF CNT IS
BEGIN
PROCESS(clk_div_s)
BEGIN
IF clk_div_s'EVENT AND clk_div_s='1' THEN
IF sel="00" THEN --"00"时,选择0~19连续变化递增;
IF data_out0<9 THEN data_out0<=data_out0+1;
ELSE data_out0<="0000";
IF data_out0="1001" AND data_out1<1 THEN data_out1<=data_out1+1;
ELSE data_out1<="0000";
END IF;
END IF;
ELSIF sel="01" THEN --"01"时,选择19~0连续变化递减; IF data_out0=0 THEN data_out0<="1001";
IF data_out1=0 THEN data_out1<="0001";
ELSE data_out1<=data_out1-1;
END IF;
ELSE data_out0<=data_out0-1;
END IF;
ELSIF sel="10" THEN --"10"时,选择偶数变化0~38递增;
IF data_out0<8 THEN data_out0<=data_out0+2;
ELSE data_out0<="0000";
IF data_out0="1000" AND data_out1<3 THEN data_out1<=data_out1+1;
ELSE data_out1<="0000";
END IF;
END IF;
ELSE --"11"时,选择38~0偶数变化递减; IF data_out0=0 THEN data_out0<="1000";
IF data_out1=0 THEN data_out1<="0011";
ELSE data_out1<=data_out1-1;
END IF;
ELSE data_out0<=data_out0-2;
END IF;
END IF;
END IF;
END PROCESS;
END;
对源程序进行编译、仿真与波形输出:
选择clk_div_s、sel、data_out0、data_out1四个端口,其中clk_div_s为时钟信号输入端口(为方便仿真与波形输出,取clk_div_s为周期10ns时钟信号信号输入),sel输入的四种状态(00、01、10、11)切换不同的计数功能,data_out0、data_out1作为数据输出,为方便验证,将data_out0、data_out1的数据数型设置为Unsigned Decimal,设置好之后即可进行仿真与波形输出,根据sel的不同状态可以得到如下四个仿真输出波形图:
"00":0~19连续变化递增波形图
"01":19~0连续变化递减波形图
"10":0~38偶数变化递增波形图
"11":38~0偶数变化递减波形图
3.3、两位七段译码器模块(seg7)
利用七段显示译码器将输入的8421BCD码译成数码管对应a~g七段显示信号,采用共阴极连接,则1对应的二极管亮,而0不亮。

程序中data_out_0为个位输入,data_out_1为十位输入,out0为个位输出,out1为十位输出,out0(0)~out0(6)对应数码管的a~g二极管,out1(0)~out1(6)对应数码管的a~g二极管。

两位七段译码器模块源程序及注释如下所示
LIBRARY IEEE;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY seg7 IS
PORT (data_out_0,data_out_1 :IN STD_LOGIC_VECTOR(3 DOWNTO 0);
out0,out1 :OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END ENTITY seg7;
ARCHITECTURE one OF seg7 IS
BEGIN
WITH data_out_0 SELECT
out0<="0111111" WHEN "0000", --显示0
"0000110" WHEN "0001", --显示1
"1011011" WHEN "0010", --显示2
"1001111" WHEN "0011", --显示3
"1100110" WHEN "0100", --显示4
"1101101" WHEN "0101", --显示5
"1111101" WHEN "0110", --显示6
"0000111" WHEN "0111", --显示7
"1111111" WHEN "1000", --显示8
"1101111" WHEN "1001", --显示9
"0000000" WHEN OTHERS; --不显示
WITH data_out_1 SELECT
out1<="0111111" WHEN "0000",
"0000110" WHEN "0001",
"1011011" WHEN "0010",
"1001111" WHEN "0011",
"1100110" WHEN "0100",
"1101101" WHEN "0101",
"1111101" WHEN "0110",
"0000111" WHEN "0111",
"1111111" WHEN "1000",
"1101111" WHEN "1001",
"0000000" WHEN OTHERS;
END;
对源程序进行编译、仿真与波形输出(以输出19和89两个数字为例):
显示18的波形图
显示89的波形图
3.4、功能模块的连接(circuit)
使用例化语句COMPONENT将1Hz方波时钟源模块(clkdiv)、可逆计数模块(CNT)和两位七段译码器模块(seg7)连接起来,实现多功能计数器的功能要求。

源程序及注释如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY circuit IS
PORT(c:IN STD_LOGIC;
s:IN STD_LOGIC_VECTOR(1 DOWNTO 0);
o0,o1:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END ENTITY circuit;
ARCHITECTURE one OF circuit IS
COMPONENT clkdiv
PORT(clk:IN STD_LOGIC;
clk_div:BUFFER STD_LOGIC);
END COMPONENT clkdiv;
COMPONENT CNT --引用前面描述的1Hz时钟信号源模块
PORT(clk_div_s:IN STD_LOGIC;
sel:IN STD_LOGIC_VECTOR(1 DOWNTO 0);
data_out0,data_out1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END COMPONENT CNT; --引用前面描述的可逆计数模块COMPONENT seg7
PORT (data_out_0,data_out_1 :IN STD_LOGIC_VECTOR(3 DOWNTO 0);
out0,out1 :OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END COMPONENT seg7; --引用前面描述的两位七段译码器模块SIGNAL x:STD_LOGIC; --定义电路中的两个连接信号
SIGNAL y,z:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN --用元器件例化语句实现元器件在电路中的连接U1:clkdiv PORT MAP(clk=>c,clk_div=>x); --元器件例化语句实现引脚连接
U2:CNT PORT MAP(clk_div_s=>x,sel=>s,data_out0=>y,data_out1=>z);
U3:seg7 PORT MAP(data_out_0=>y,data_out_1=>z,out0=>o0,out1=>o1);
END;忽略此处..。

相关文档
最新文档