一、 实验类型(Experiment type) ): :综合设计性实验
二、 实验目的(Experimental purposes
1. 掌握多位计数器相连的设计方法。
2. 掌握十进制,六进制,二十四进制计数器的设计方法。
3. 掌握扬声器(The speaker)的驱动(driving)。
4. 掌握 EPLD 技术的层次化(layering)设计方法。
三、 实验内容(Experiment contents )
完成数字时钟的设计,要求该时钟具有下述功能:
1. 具有时,分,秒,计数显示功能,以 24 小时循环计时。
2. 具有清零,调节小时、分钟功能。
3. 具有整点报时功能,整点报时的同时 LED 灯花样显示。
四、 实验原理 ( (Experimental principle)
在同一 EPLD 芯片 EPF10K10 上集成了如下电路模块:
1. 时钟计数: 秒——60 进制 BCD 码计数;
分——60 进制 BCD 码计数;
时——24 进制 BCD 码计数;
同时整个计数器有清零,调分,调时功能。在接近整数时间能提供报时信号。
2. 具有驱动 8 位八段共阴扫描数码管(8 bits erection of Yin scanning
digital tube)的片选驱动信号输出和八段字形译码输出。
3. 扬生器在整点时有报时驱动信号产生。
五、 实验要求 ( (Experimental requirements)
硬件要求
1. 主芯片 EP5CSEMA5F31C6N。
2. 8 个 LED 灯。
3. 扬声器。
4. 8 位八段扫描共阴级数码显示管。
5. 三个按键开关(清零,调小时,调分钟)。
各模块都由 VHDL 语言编写。顶层设计采用原理图设计方法实现。根据电路
持点,可在教师指导下用层次设计概念。将此设计任务分成若干模块,规定每
一模块的功能和各模块之间的接口。由几个学生分做和调试其中之一,然后再
将各模块合起来联试。以培养学生之间的合作精神,同时加深层次化设计概念。
要求每组学生完成各自相应的任务,最后将其综合起来,实现仿真和硬件
68
EDA 技术实验指导书
测试功能。
六、 实验仪器设备 ( (Experiment instruments)
计算机、EDA 实验箱、导线。
七、 预习要求 ( (Preview requirements)
要求学生自己写出详细的实验电路原理图、实验步骤以及调试过程。
八、 实验报告要求 ( (Experimental reporting requirements)
将实验原理、设计过程、编译仿真波形和分析结果、硬件测试实验结果写
进实验报告。
代码
代码解释
好的,我将逐句解释这个代码:
1. `module acfsy_4(clk,rst,sec,min,hour,cout1,cout2,beef,led);` 定义了一个名为acfsy_4的模块,并指定了其输入和输出信号。
2. `input clk,rst,cout1,cout2;` 指定clk、rst、cout1、cout2为输入信号。
3. `output reg[7:0] sec,min,hour;` 指定sec、min、hour为输出信号,并声明它们是8位宽的寄存器类型。
4. `output beef;` 指定beef为一个普通的输出信号。
5. `output[7:0] led;` 指定led为一个8位宽的输出信号。
6. `reg minclk=0,hclk=0;` 声明两个内部寄存器minclk和hclk,并初始化为0。
7. `wire m_clk,h_clk,cout1,cout2;` 声明m_clk和h_clk为内部连线(wire),并重申cout1和cout2作为输入信号。
8. `always @(posedge clk or posedge rst)` 使用always语句在时钟上升沿或复位事件发生时执行以下操作。
9. `begin` 开始描述秒计数器的行为。
10. `if(rst) begin sec<=0;minclk<=1; end else begin` 如果检测到复位信号,则清零秒寄存器并将分钟计数器的内部clk置位;否则继续执行其他逻辑。
11. `if(sec==8'h59) begin sec<=0;minclk<=1;end` 当秒寄存器达到最大值(8'h59)时,清零秒寄存器并置位分钟计数器的内部clk。
12. `else if(sec[3:0]==4'b1001) begin sec[3:0]<=4'b0000; sec[7:4]<=sec[7:4]+1; end` 如果秒寄存器的低四位等于4'b1001,则进位到高四位,同时将低四位清零。
13. `else sec[3:0]<=sec[3:0]+1;` 否则,只对秒寄存器的低四位加1。
14. `minclk<=0;` 将分钟计数器的内部clk置位为0。
15. `end` 结束秒计数器的行为描述。
16. `end` 结束always语句。
17. `assign m_clk=minclk|cout1;` 计算m_clk信号,它是分钟计数器的内部clk与cout1信号的逻辑或。
18. `always @(posedge m_clk or posedge rst)` 在m_clk上升沿或复位事件发生时执行以下操作。
19. `begin` 开始描述分钟计数器的行为。
20. `if(rst) begin min<=0;hclk<=1; end else begin` 如果检测到复位信号,则清零分钟寄存器并将小时计数器的内部clk置位;否则继续执行其他逻辑。
21. `if(min==8'h59) begin min<=0;hclk<=1; end` 当分钟寄存器达到最大值(8'h59)时,清零分钟寄存器并置位小时计数器的内部clk。
22. `else if(min[3:0]==4'b1001) begin min[3:0]<=4'b0000; min[7:4]<=min[7:4]+1; end` 如果分钟寄存器的低四位等于4'b1001,则进位到高四位,同时将低四位清零。
23. `else begin min[3:0]<=min[3:0]+1 ;end` 否则,只对分钟寄存器的低四位加1。
24. `hclk<=0;` 将小时计数器的内部clk置位为0。
25. `end` 结束分钟计数器的行为描述。
26. `end` 结束always语句。
27. `assign h_clk=hclk|cout2;` 计算h_clk信号,它是小时计数器的内部clk与cout2信号的逻辑或。
28. `always @(posedge h_clk or posedge rst)` 在h_clk上升沿或复位事件发生时执行以下操作。
29. `begin` 开始描述小时计数器的行为。
30. `if(rst) begin hour<=0;end else begin` 如果检测到复位信号,则清零小时寄存器;否则继续执行其他逻辑。
31. `if(hour==8'h23) begin hour<=0;end` 当小时寄存器达到最大值(8'h23)时,清零小时寄存器。
32. `else if(hour[3:0]==4'b1001)
begin hour[7:4]<=hour[7:4]+1; hour[3:0]<=0; end` 如果小时寄存器的低四位等于4'b1001,则进位到高四位,同时将低四位清零。
33. `else begin hour[3:0]<=hour[3:0]+1;end` 否则,只对小时寄存器的低四位加1。
34. `end` 结束小时计数器的行为描述。
35. `end` 结束always语句。
36. `assign beef= (min == 0)&&(sec == 0) ? 1 : 0;` 计算beef信号,如果分钟寄存器和秒寄存器都为0,则beef被赋值为1;否则被赋值为0。
37. `assign led = (min == 0)&&(sec == 0) ? 8'b01010101 : 8'b11001100;` 计算led信号,如果分钟寄存器和秒寄存器都为0,则led被赋值为特定的二进制值;否则被赋值为另一个二进制值。
38. `endmodule` 结束模块定义。