名称:课堂打铃系统的设计Verilog代码Xilinx ISE EVM31开发板
软件:Xilinx ISE
语言:Verilog
代码功能
该课堂打铃系统基于FPGA实现,主要功能包括实时时钟显示和自动打铃控制。系统能够根据预设的课程时间表自动触发不同时长的铃声,包括长铃(12秒)、短铃(7秒)和间歇铃。支持手动时间设置功能,通过按键调整小时、分钟和秒数。系统采用BCD码转换和动态扫描显示技术,实时显示当前时间。
图片
图题:EVM31开发板
设计文档:
代码实现思路
系统采用模块化设计,主模块digital_clock作为控制器。分频模块将系统时钟分频为1Hz和1KHz信号。时间设置模块实现实时时钟功能,支持手动调整时间。打铃控制模块根据预设的课程时间表判断当前时间是否需要打铃,并控制蜂鸣器输出相应铃声。显示模块采用动态扫描技术驱动数码管显示时间信息。
代码结构
系统采用层次化模块结构:
- digital_clock.v - 顶层模块,集成所有功能模块
- fenping.v - 分频模块,产生1Hz和1KHz时钟
- time_set.v - 时间设置模块,实现实时时钟功能
- ring_ctrl.v - 打铃控制模块,根据时间表控制铃声
- disp.v - 显示模块,驱动数码管显示时间
- BCD.v - BCD码转换模块
各模块协同工作,实现完整的课堂打铃系统功能。
部分代码
// 打铃控制模块 module ring_ctrl( input clk_in, // 系统时钟 input hour_key, // 小时按键 input minute_key, // 分钟按键 input second_key, // 秒按键 input[7:0]hour_BCD, // 小时BCD input[7:0]minute_BCD,// 分钟BCD input[7:0]second, // 秒 output beep // 低电平有效 ); reg long_ring; // 长铃 reg short_ring; // 短铃 reg stop_ring; // 间歇铃 wire [15:0] time_hm; assign time_hm={hour_BCD,minute_BCD}; // 长铃12秒 always@(posedge clk_in) if(time_hm==16'h0630 || time_hm==16'h0710 || time_hm==16'h1216 || time_hm==16'h1730 || time_hm==16'h2330) if(second>=0 && second<12) long_ring<=1; else long_ring<=0; else long_ring<=0; // 短铃7秒 always@(posedge clk_in) if(time_hm==16'h0751 || time_hm==16'h1335 || time_hm==16'h0845 || time_hm==16'h0935 || time_hm==16'h1035 || time_hm==16'h1125 || time_hm==16'h1215 || time_hm==16'h1430 || time_hm==16'h1520 || time_hm==16'h1620 || time_hm==16'h1710 || time_hm==16'h1915 || time_hm==16'h2010 || time_hm==16'h2105 || time_hm==16'h0645) if(second>=0 && second<7) short_ring<=1; else short_ring<=0; else short_ring<=0; // 间歇铃 always@(posedge clk_in) if(time_hm==16'h0800 || time_hm==16'h0850 || time_hm==16'h0950 || time_hm==16'h1040 || time_hm==16'h1130 || time_hm==16'h1345 || time_hm==16'h1435 || time_hm==16'h1535 || time_hm==16'h1625 || time_hm==16'h1830 || time_hm==16'h1925 || time_hm==16'h2020) if((second>=0 && second<3) || (second>=6 && second<9) || (second>=12 && second<15)) stop_ring<=1; else stop_ring<=0; else stop_ring<=0; reg ring_en; always@(posedge clk_in) if(hour_key | minute_key |second_key) // 设置时间时关闭铃声 ring_en<=0; else if(long_ring | short_ring | stop_ring) ring_en<=1; else ring_en<=0; assign beep=~ring_en; // 低电平有效 endmodule
342