
班级:通信1121 姓名:王密 学号:1121302230
一、实验目的 :
1、地运用数字系统的设计方法进行数字系统设计。
2、能进行较复杂的数字系统设计。
3、数字钟的工作原理, 数字钟的工作流程图与原理方框图, 自顶向下的数字系统设计方法。
二、实验原理:
1、数字钟的基本工作原理:
数字钟以其显示时间的直观性、走时准确性而受到了人们的欢迎并很快走进了千 家万户。作为一种计时工具,数字钟的基本组成部分离不开计数器,在控制逻辑电路的控制下完成预定的各项功能。数字钟的基本原理方框图如下:
(1)时基T 产生电路:由晶振产生的频率非常稳定的脉冲,经整形、稳定电路后,产生一个频率为 1Hz的、非常稳定的计数时钟脉冲。
(2)控制逻辑电路:产生调时、调分信号及位选信号。
调时、调分信号的产生:由计数器的计数过程可知,正常计数时,当秒计数器( 60进制)计数到59 时,再来一个脉冲,则秒计数器清零,重新开始新一轮的计数,而进位则作为分计数器的计数脉冲,使分计数器计数加1。现在我们把电路稍做变动:把秒计数器的进位脉冲和一个频率为2Hz的脉冲信号同时接到一个2选1数据选择器的两个数据输入端,而位选信号则接一个脉冲按键开关,当按键开关不按下去时(即为0),则数据选择器将秒计数器的进位脉冲送到分计数器,此时,数字钟正常工作;当按键开关按下去时(即为1),则数据选择器将另外一个2Hz 的信号作为分计数器的计数脉冲,使其计数频率加快,当达到正确时间时,松开按键开关,从而达到调时的目的。调节小时的时间也一样的实现。
(3)计数显示电路:由计数部分、数据选择器、译码器组成,是时钟的关键部分。
计数部分: 由两个 60进制计数器和一个24 进制计数器组成,其中60 进制计数器可用6 进制计数器和10 进制计数器构成;24 进制的小时计数同样可用6 进制计数器和10 进制计数器得到:当计数器计数到24 时,“2”和“4”同时进行清零,则可实现24 进制计数。
数据选择器:84输入14输出的多路数据选择器,因为本实验用到了8个数码管(有两个用来产生隔离符号‘—')。
译码器:七段译码器。译码器必须能译出‘—’,由实验二中译码器真值表可得:字母 F 的8421BCD 码为“1111”,译码后为“1000111”,现在如果只译出‘—’,即字母F的中间一横,则译码后应为“0000001”,这样,在数码管上显示的就为‘—’。
2、自顶向下设计分割图:
说明:按一下按键key0,完成复位功能,clk5选择1Hz的时钟,clk3选择的时钟频率尽量高。
三、实验连线:
1、将EP2C5适配板左下角的JTAG用十芯排线和万用下载区左下角的SOPC JTAG口连接起来,万用下载区右下角的电源开关拨到 SOPC下载的一边。
2、请将JPLED1短路帽右插,JPLED的短路帽全部上插,实验板右下方频率源 CLK1接任意频率作为扫描频率。
3、将实验板左端的JP103全部用短路帽接上(共八个)。
四、实验内容与步骤:(程序:EP2C5\imer\imer.sof)
1、打开Quartus II 6.0软件,点击“File→OpenProject”出现如下的对话框(图10.1),选中timer,点打开即可;
图10.1
2、点击“Tools-Programmer”后出现如下的对话窗口,
3、在点”Edit→Add File………”出现如下对话框(图10.2),在图10.3对话框中,选中EP2C5/timer/timer.sof项目后点击打开回到Programmer对话框, 在下载对话窗口中“选中Program/ Configure”,点击“Start”即进行下载。
图10.2
图10.3
现将timer.vhd原程序作如下说明:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_SIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY TIMER IS
PORT( CLK5:IN STD_LOGIC;
CLK3:IN STD_LOGIC;
RST1:IN STD_LOGIC;
SEG_SEL:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
SEG_DA :OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END TIMER;
ARCHITECTURE ADO OF TIMER IS
COMPONENT CNT10
PORT(CLK:IN STD_LOGIC;
RST:IN STD_LOGIC;
CIN:IN STD_LOGIC;
CNT_VAL:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT :OUT STD_LOGIC
);
END COMPONENT;
COMPONENT CNT6
PORT(CLK :IN STD_LOGIC;
RST :IN STD_LOGIC;
CIN :IN STD_LOGIC;
CNT_VAL:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT:OUT STD_LOGIC
);
END COMPONENT;
COMPONENT CNT2
PORT(CLK: IN STD_LOGIC;
RST: IN STD_LOGIC;
CIN: IN STD_LOGIC;
CNT_VAL:INOUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT :OUT STD_LOGIC
);
END COMPONENT;
COMPONENT CNT4
PORT (CLK:IN STD_LOGIC;
RST:IN STD_LOGIC;
CIN:IN STD_LOGIC;
CNT_VAL:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT:OUT STD_LOGIC
);
END COMPONENT;
SIGNAL SEG_BUF1,SEG_BUF2,SEG_BUF3,SEG_BUF4:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL SEG_BUF5,SEG_BUF6,SEG_BUF7,SEG_BUF8:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL SEG_CNT :STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL SEG_TEMP:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL COUT:STD_LOGIC_VECTOR(5 DOWNTO 0);
SIGNAL CLK:STD_LOGIC;
BEGIN
PROCESS (CLK3)
BEGIN
IF CLK3'EVENT AND CLK3='1' THEN
CLK<=NOT CLK ;
END IF;
END PROCESS;
PROCESS (CLK, RST1)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
IF RST1='1' THEN
SEG_CNT<="000";
ELSE
SEG_CNT<=SEG_CNT+1;
END IF;
END IF;
END PROCESS;
SEG_SEL<=SEG_CNT;
SEG_BUF3<="1111";
SEG_BUF6<="1111";
PROCESS(SEG_CNT,SEG_BUF1,SEG_BUF2,SEG_BUF3,SEG_BUF4,SEG_BUF5,SEG_BUF6,SEG_BUF7,SEG_BUF8)
BEGIN
CASE SEG_CNT IS
WHEN "000" => SEG_TEMP<=SEG_BUF1;
WHEN "001" => SEG_TEMP<=SEG_BUF2;
WHEN "010" => SEG_TEMP<=SEG_BUF3;
WHEN "011" => SEG_TEMP<=SEG_BUF4;
WHEN "100" => SEG_TEMP<=SEG_BUF5;
WHEN "101" => SEG_TEMP<=SEG_BUF6;
WHEN "110" => SEG_TEMP<=SEG_BUF7;
WHEN "111" => SEG_TEMP<=SEG_BUF8;
WHEN OTHERS => NULL;
END CASE;
END PROCESS;
PROCESS (SEG_TEMP)
BEGIN
CASE SEG_TEMP IS
WHEN "0000" => SEG_DA<=x"3F";
WHEN "0001" => SEG_DA<=x"06";
WHEN "0010" => SEG_DA<=x"5B";
WHEN "0011" => SEG_DA<=x"4F";
WHEN "0100" => SEG_DA<=x"66";
WHEN "0101" => SEG_DA<=x"6D";
WHEN "0110" => SEG_DA<=x"7D";
WHEN "0111" => SEG_DA<=x"07";
WHEN "1000" => SEG_DA<=x"7F";
WHEN "1001" => SEG_DA<=x"6F";
WHEN "1010" => SEG_DA<=x"77";
WHEN "1011" => SEG_DA<=x"7B";
WHEN "1100" => SEG_DA<=x"39";
WHEN "1101" => SEG_DA<=x"3E";
WHEN "1110" => SEG_DA<=x"79";
WHEN "1111" => SEG_DA<=x"00";
END CASE;
END PROCESS;
U1 : CNT10 PORT MAP (CLK=>CLK5,RST=>RST1,CNT_VAL=>SEG_BUF1,COUT=>COUT(0),CIN=>'1');
U2 : CNT6 PORT MAP (CLK=>CLK5,RST=>RST1,CNT_VAL=>SEG_BUF2,COUT=>COUT(1),CIN=>COUT(0));
U3 : CNT10 PORT MAP (CLK=>CLK5,RST=>RST1,CNT_VAL=>SEG_BUF4,COUT=>COUT(2),CIN=>COUT(1));
U4 : CNT6 PORT MAP (CLK=>CLK5,RST=>RST1,CNT_VAL=>SEG_BUF5,COUT=>COUT(3),CIN=>COUT(2));
U5 : CNT4 PORT MAP (CLK=>CLK5,RST=>RST1,CNT_VAL=>SEG_BUF7,COUT=>COUT(4),CIN=>COUT(3));
U6 : CNT2 PORT MAP (CLK=>CLK5,RST=>RST1,CNT_VAL=>SEG_BUF8,COUT=>COUT(5),CIN=>COUT(4));
END ADO;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
USE IEEE.STD_LOGIC_SIGNED.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY CNT10 IS
PORT(CLK :IN STD_LOGIC;
RST :IN STD_LOGIC;
CIN :IN STD_LOGIC;
CNT_VAL:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT:OUT STD_LOGIC
);
END CNT10;
ARCHITECTURE BEHAVE OF CNT10 IS
SIGNAL CNT_T:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
PROCESS(CLK)
BEGIN
IF RST='1' THEN
CNT_T<="0000";
ELSIF CLK'EVENT AND CLK='1' THEN
IF CIN='1' THEN
IF CNT_T/= 9 THEN
CNT_T<=CNT_T+1;
ELSE
CNT_T<="0000";
END IF;
END IF;
ELSE
CNT_T<=CNT_T;
END IF;
END PROCESS;
COUT<='1' WHEN CNT_T=9 AND CIN='1' ELSE '0' ;
CNT_VAL<=CNT_T;
END BEHAVE;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
USE IEEE.STD_LOGIC_SIGNED.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY cnt6 IS
PORT(CLK :IN STD_LOGIC;
RST :IN STD_LOGIC;
CIN :IN STD_LOGIC;
CNT_VAL:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT:OUT STD_LOGIC
);
END CNT6;
ARCHITECTURE ADO2 OF CNT6 IS
SIGNAL CNT_T :STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL COUTD :STD_LOGIC;
BEGIN
PROCESS (CLK,RST)
BEGIN
IF RST='1' THEN
CNT_T<="0000";
ELSIF CLK'EVENT AND CLK='1' THEN
IF CIN='1' THEN
IF CNT_T< 5 THEN
CNT_T<=CNT_T+1;
ELSE
CNT_T<=x"0";
END IF;
END IF;
ELSE
CNT_T<=CNT_T;
END IF;
END PROCESS;
COUT<='1' WHEN CNT_T=5 AND CIN='1' ELSE '0';
CNT_VAL<=CNT_T;
END ADO2;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_SIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY CNT2 IS
PORT(CLK :IN STD_LOGIC;
RST :IN STD_LOGIC;
CIN:IN STD_LOGIC;
CNT_VAL:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT:OUT STD_LOGIC
);
END CNT2;
ARCHITECTURE ADO3 OF CNT2 IS
SIGNAL CNT_T:STD_LOGIC_VECTOR (3 DOWNTO 0);
BEGIN
PROCESS(CLK,RST)
BEGIN
IF RST='1' THEN
CNT_T<="0000";
ELSIF CLK'EVENT AND CLK='1' THEN
IF CIN='1' THEN
IF CNT_T<1 THEN
CNT_T<=CNT_T+1;
ELSE
CNT_T<="0000";
END IF;
END IF;
ELSE
CNT_T<=CNT_T;
END IF;
END PROCESS;
COUT<='1' WHEN CNT_T=1 AND CIN='1' ELSE '0';
CNT_VAL<=CNT_T;
END ADO3;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_SIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY CNT4 IS
PORT(CLK :IN STD_LOGIC;
RST:IN STD_LOGIC;
CIN:IN STD_LOGIC;
CNT_VAL:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
COUT:OUT STD_LOGIC
);
END CNT4;
ARCHITECTURE BEHAVE OF CNT4 IS
SIGNAL CNT_T:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL i:INTEGER;
BEGIN
PROCESS(CLK,RST)
BEGIN
i <= 0;
IF RST='1' THEN
CNT_T<="0000";
i <=0;
ELSIF CLK'EVENT AND CLK='1' THEN
IF i<2 THEN
IF CIN='1' THEN
IF CNT_T<9 THEN
CNT_T<=CNT_T+1;
ELSE
CNT_T<="0000";
END IF;
END IF;
ELSE
IF CIN='1' THEN
IF CNT_T<3 THEN
CNT_T<=CNT_T+1;
ELSE
CNT_T<="0000";
END IF;
END IF;
END IF;
ELSE
CNT_T<=CNT_T;
END IF;
END PROCESS;
CNT_VAL<=CNT_T;
COUT<='1' WHEN (CNT_T=9 AND CIN='1')OR (CNT_T=3 AND CIN='1' AND i=2) ELSE '0';
END BEHAVE;
引脚分配(Cyclone EP2C5Q208C8):
seg_d0-P3、seg_d1-P5、seg_d2-P6、seg_d3-P8、seg_d4-P10、seg_d5-P11、seg_d6-P12,sel0-P141、sel1-P142、sel2-P143,clk3-P130,rst-P43,clk5-P145
管脚标号seg_d0到seg_d 6分别接到LED的8位段码中的7位上(由于实验中不需要在LED上显示“.”,因此8位段码中显示“.”的数据没有接入,其默认为低电平,有兴趣的同学可以自己修改一下程序,其管脚分配如附录三所示);sel0到sel2接到实验箱中74ls138的输入端;clk为LED显示时钟输入,接到频率源clk1。clk5为电子时钟的震荡频率,100脚接key0用作系统复位。管脚标号对应的I/O如下图所示:
User
Assignments Node Name
set_location_assignment PIN_3 -to seg_da[0]
set_location_assignment PIN_5 -to seg_da[1]
set_location_assignment PIN_6 -to seg_da[2]
set_location_assignment PIN_8 -to seg_da[3]
set_location_assignment PIN_10 -to seg_da[4]
set_location_assignment PIN_11 -to seg_da[5]
set_location_assignment PIN_12 -to seg_da[6]
set_location_assignment PIN_141 -to seg_sel[0]
set_location_assignment PIN_142 -to seg_sel[1]
set_location_assignment PIN_143 -to seg_sel[2]
set_location_assignment PIN_43 -to rst
set_location_assignment PIN_145 -to clk5
set_location_assignment PIN_130 -to clk3
五、实验现象:
在数码管上,会显示当前的时钟值,格式为11 11 11.会有两个数码管是熄灭的,作为小时和分钟的间隔,分钟和秒钟的间隔。
六、实验体会:
这次实验比较复杂,因为之前没有处理过这么长的代码,然后在老师的讲解之下看懂了代码,然后修改了日期之间进制的问题,所以花的时间比较多,但是收获很多。同时要感谢小组成员的合作。
