
一、实验目的:
1、深刻理解VHDL语言元件例化的方法。
2、掌握计数器的设计原理以及设计方法。
3、结合以前学过的数码管扫描知识完成计数器显示学号后三位。
二、实验原理:
计数器是可以统计时钟脉冲次数的时序器件,为了使计数器可以显示学号后三位,采用级联的形式来设计计数器,如十进制的计数器与六进制的计数器级联即构成了六十进制计数器。使用3个带Carry-in和Carry-out模10的计数器的计数输出分别作为计数器个位、十位、百位的输出,设计模108计数器。
实验内容:
本次实验要求设计一个模为自己学号后 3 位的计数器(模108)。各个零部件可以用LPM来定制,而顶层则要使用VHDL语言以元件例化的方法来实现。
1、VHDL语言的部分代码:
library ieee;
use ieee.std_logic_11.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity exp_cnt108 is
port(clk0,clk,clrn,En:in std_logic;
b,s,g:out std_logic_vector(3 downto 0);
c:out std_logic;
cc:out std_logic;
sb,ss,sg:out std_logic;
ga,gb,gc,gd,ge,gf,gg:out std_logic);
end exp_cnt108;
architecture rtl of exp_cnt108 is
component count4
port(clk:in std_logic;
q:out std_logic_vector(1 downto 0));
end component;
component decoder2_3
port(data:in std_logic_vector(1 downto 0);
eq0,eq1,eq2:out std_logic);
end component;
component mux4_3_1
port( data0x : IN STD_LOGIC_VECTOR (3 DOWNTO 0);
data1x : IN STD_LOGIC_VECTOR (3 DOWNTO 0);
data2x : IN STD_LOGIC_VECTOR (3 DOWNTO 0);
sel : IN STD_LOGIC_VECTOR (1 DOWNTO 0);
result : OUT STD_LOGIC_VECTOR (3 DOWNTO 0));
end component;
component my7449
port(cout:in std_logic_vector(3 downto 0);
a,b,c,d,e,f,g:out std_logic);
end component;
component exp_cnt10
port(Clk,clrn,En,cin:in std_logic;
cq:out std_logic_vector(3 downto 0);
cout:out std_logic);
end component;
signal clr,cin:std_logic;
signal q:std_logic_vector(1 downto 0);
signal coutb,couts,coutg,cout:std_logic_vector(3 downto 0);
signal c1,c2,c3: std_logic;
signal eq0,eq1,eq2: std_logic;
signal qa,qb,qc,qd,qe,qf,qg: std_logic;
begin
u0:count4 port map(clk0,q);
u1:decoder2_3 port map(q,eq0,eq1,eq2);
sb<=eq2;
ss<=eq1;
sg<=eq0;
cin<='1';
u2:exp_cnt10 port map(clk,clrn or clr,En,cin,coutg,c1);
u3:exp_cnt10 port map(clk,clrn or clr,En,c1,couts,c2);
u4:exp_cnt10 port map(clk,clrn or clr,En,c2 and c1,coutb,c3);
b<=coutb;
s<=couts;
g<=coutg;
cc<=c1;
c<=c2;
clr<=coutb(0) and coutg(3);
u5:mux4_3_1 port map(coutg,couts,coutb,q,cout);
u6:my7449 port map(cout,qa,qb,qc,qd,qe,qf,qg);
ga<=qa;
gb<=qb;
gc<=qc;
gd<=qd;
ge<=qe;
gf<=qf;
gg<=qg;
end rtl;
三、波形仿真及下载验证:
如图所示:
波形仿真:
仿真参数设置:
Entime:45us Grid size:100ns clk:clock→period:10ns
波形说明:
clrn为0,En为0时,保持;
clrn为0,En为1时,计数;
clrn为1时,清零;
由仿真图知,计数到107后从0开始计数。
其中b为输出数据的百位,s为输出数据的十位,g为输出数据的个位,c为模108计数器的进位输出。
结论:
仿真结果与预期一致,正确。
下载验证:
管脚锁定:
clk0: 55 clk:125 En:83 clrn:82 sb、ss、sg:135,133,132
qa,qb,qc,qd,qe,qf,qg:136,137,138,140,141,142,143
下载结果:
当按下83后,数码管显示数字从000开始数,数到108后清零重新计数。
五、 思考题
1、说明任意进制的设计方法。
要是用数码管显示的话,所模的数字有几个数位就用几个模10计数器,利用几个计数器的输出端口的中几个输出端口制定与、非的关系表示出所模数字,构成另一清零端。
不用数码管显示的话,可以直接使用VHDL代码写,将实验内容中模10计数器的代码中的9改成所模数字就可以了。
2、列举 LPM 参数可定制的计数器类型。
1.模任意数字计数器;
2.加法计数减法计数
3.具有计数使能,时钟信号使能、同/异步清零/置位、保持功能
3、如何利用 generic 设计用户参数化计数器?
generic 类属参量是元件实体说明的可选项,放在端口说明前面,为元件实体和外部环境通信的静态信息提供通道。含 generic 的实体可参数化设置元件规模或特性,如端口大小、元件数目、定时特性等。
4、分频器的占空比的设计关键:
在于计数器进位输出电平反转的时机。
5、偶数次分频器与技术次分频器的 VHDL 设计方法主要区别:
偶数次分频器通过计数值来控制输出时钟的高电平或低电平的时间;
奇数次分频器采用加法计数器设计,需要对时钟上升沿和下降沿分别计数,根据两个计 数值控制输出时钟的电平;
6、如何设计 0.5 次分频器?
分频系数为 N - 0.5 的实现可以采用 1 个模 N的减法计数器、1 个异或门、1 个二分频器。
六、 实验心得:
通过此次试验,我对计数器和VHDL语言有了进一步的了解,由于编程不太好,这次代码请教了不少同学,以后一定要加强这方面的学习。
