资源描述
班级:2009211411 学号:09211999 姓名:陈东东
三十进制和六分频计数电路设计
1.实验目的:(1)计数器设计
设计一个三十进制计数器,要求用两位七段数码管显示(计时电路)
(2)分频电路设计,六分频电路设计,在前面三十进制计数器基础上设计六分频电路,并同时用七段数码管显示。
2.实验内容和原理:
采用几个触发器的状态,按照一定规律随时钟变化来记忆时钟的个数。一个4位二进制计数器可以构成1位十进制计数器,即1位BCD计数器。2位十进制计数器连起来可以构成一个30进制计数器.当时钟个数记到30时,十位和各位都变为0000,否则的话,每来一个时钟,个位就加1,当各位为1001时,时钟到来十位加1.再分别将个位十位bcd码转换为七段数码管对应的数字。
校正函数:function zhuan(j:in std_logic_vector(3 downto 0))
return std_logic_vector is
variable k:std_logic_vector(6 downto 0);
begin
case j is
when "0000"=>k:="1111110";--不显示00首两位表示数码管是(0)否(1)显示
when "0001"=>k:="0110000";
when "0010"=>k:="1101101";
when "0011"=>k:="1111001";
when "0100"=>k:="0110011";
when "0101"=>k:="1011011";
when "0110"=>k:="0011111";
when "0111"=>k:="1110000";
when "1000"=>k:="1111111";
when "1001"=>k:="1110011";
when others=>k:="1000000";
end case;
return(k);
end zhuan;
3.程序框图:机器频率=》分频得到目的频率=》对上升沿个数计数=》十位各位对上升沿到来时相应的变化=》BCD码与七段数码管的转化关系=》六分频与上升沿的变化关系。
4..源程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY houcheng_09212004 IS
PORT(a: IN STD_LOGIC;
Clkout: OUT std_logic_vector(6 downto 0);
m: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
n: OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END houcheng_09212004;
ARCHITECTURE rtl OF houcheng_09212004 IS
SIGNAL bcd1n: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL bcd10n: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL x: STD_LOGIC_VECTOR(3 DOWNTO 0);
signal clkin: std_logic:='0';
SIGNAL Counter:Integer ;
SIGNAL y:Integer;
SIGNAL clk :std_logic;
function zhuan(j:in std_logic_vector(3 downto 0))—BCD码对应七段数码管的转换
return std_logic_vector is
variable k:std_logic_vector(6 downto 0);
begin
case j is
when "0000"=>k:="1111110";--不显示00首两位表示数码管是(0)否(1)显示
when "0001"=>k:="0110000";
when "0010"=>k:="1101101";
when "0011"=>k:="1111001";
when "0100"=>k:="0110011";
when "0101"=>k:="1011011";
when "0110"=>k:="0011111";
when "0111"=>k:="1110000";
when "1000"=>k:="1111111";
when "1001"=>k:="1110011";
when others=>k:="1000000";
end case;
return(k);
end zhuan;
BEGIN
m<=zhuan(bcd1n);--多个变量含有bcd10,和bcd1,所以不再用bcd
n<=zhuan(bcd10n);--m,n,clkout分别为三十进制的十位,个位,六分频的输出的七段数码管信号,通过函数zhuan实现从bCD到七段数码管信号的转换
clkout<=zhuan(x);
PROCESS(a)
BEGIN
IF(a'event AND a='1') THEN—a为机器晶振的频率,clk为希望的道德频率,此处为了得到合适的频率,而缩小了机器的频率。
IF(y=0) THEN—为了仿真方便,此处选用y=0,为2分频
y <= 0;
clk<=NOT clk;
ELSE
y<=y+1;
END IF;
END IF;
END PROCESS;
PROCESS(clk) --处理个位
BEGIN
IF(clk'event AND clk='1') THEN—对个位的处理,当为9时,上升沿到来变为0,不为9则加1
IF(bcd1n="1001") THEN
bcd1n<="0000";
ELSE
bcd1n<=bcd1n+1;
end if;
end if;
IF(clk'event AND clk='0') THEN对十位的处理,当为29时,上升沿到来时变为0,否则,在个位为9时且上升沿到来加1处理。
IF(bcd1n ="1001") THEN
IF(bcd10n = "0010") THEN
bcd10n<="0000";
ELSE
bcd10n<=bcd10n+1;
end if;
end if;
IF Counter=2 THEN—对得到的频率clk 6分频
Counter <= 0;
clkin<=NOT clkin;
ELSE
Counter<=Counter+1;
END IF;
end if;
END PROCESS;
PROCESS(clkin) --对6分频后的频率5进制计数显示,则30进制和6分频后的5进制同时变为0.
BEGIN
IF(clkin'event AND clkin='1') THEN
IF(x="0100") THEN
x<="0000";
ELSE
x<=x+1;
end if;
end if;
end process;
END rtl;
5.测试用例:为仿真方便,取a为5MHZ,对a二分频,得到目的频率clk 为2.5MHZ,
测试目的:观察是否实现30进制计数,六分频的实现
预计结果:bcd10n和bcd1n一起从0到29计数,x实现了5进制计数,且和30进制计数同时变为0.
6.仿真波形图:
由图可见,bcd1n从0变为9循环显示,bcd10n从0变为2循环显示。X从0变为4循环显示,m,n,clkout分别对应bcd1n,bcd10n,x的七段数码管信号变化。由于延时的存在,6分频变为0时,30进制滞后了2us后变为0,但这不影响他们同时变为0的结论。所以与预期结果一致。
7.遇到的困难和解决办法:
(1)怎么实现三十进制的七段数码管表示?
想到用bcd码表示十进制数,然后通过case语句实现bcd码与七段数码信号的转换。
(2)六分频与30进制的上升沿信号不同,怎么实现同步置零?
想到利用分频语句,实现上升沿分频,通过两个process进程语句,实现新的上升沿作为计数敏感信号。从而使得30进制与6分频同步置零。
展开阅读全文