十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SMART SOPC实验箱多功能数字钟:分频、74160计时与动态扫描

SMART SOPC实验箱多功能数字钟:分频、74160计时与动态扫描 简介这份多功能数字钟实验报告来自南京理工大学EDA(2)课程设计面向电子信息、电子工程等专业学习数字电路与EDA技术的学生可用于课程实验报告参考、Quartus II设计流程学习及SMART SOPC实验箱验证对照。报告围绕24小时计时、保持、清零、快速校时校分、整点报时与动态显示等功能展开完整记录了脉冲发生、计时、清零、校时校分、保持、报时及译码显示等子模块的设计方案、编辑与波形图仿真过程并说明各模块如何合并为总电路。作者还整理了实验中遇到的问题、解决思路以及收获与感受对初学者梳理设计脉络、规避常见错误较有借鉴意义。资源包共1个doc文档约688KB结构含摘要、目录、设计要求、实验原理、模块电路设计、总电路图与参考文献等章节目前已有302人浏览学习适合需要动手完成同类数字钟设计的读者参考。1. 从一块 SMART SOPC 实验箱说起多功能数字钟到底练什么南京理工大学 EDA(2) 实验里多功能数字钟是很多人第一次把数字逻辑课上的 74160、74151、7447 真正连成系统的地方。Quartus II 7.0 画原理图、仿真波形、再下载到 SMART SOPC 实验箱这套流程看起来只是做一个 24 小时计时器但实际卡人的地方往往不是“钟”本身而是 48MHz 怎么分到 1Hz、模 60 怎么无毛刺回零、动态扫描为什么会有重影。它适合正在做 EDA 课程设计的学生也适合想借这个题目把分频链、模计数、总线复用和按键防抖串一遍的工程师。下面按我拆这个实验的顺序从脉冲发生到顶层下载把能抄的参数和容易翻车的点都摊开。2. 脉冲发生与计时核心48MHz 分频链和 74160 模 60/模 24 计数器2.1 分频链的级联顺序与 74160 置数法SMART SOPC 实验箱一般只给一个 48MHz 有源晶振而秒计数器要的是 1Hz。常见做法是先用两片 74160 做 48 分频得到 1MHz再用三片 74160 级联做 1000 分频得到 1kHz接着用 D 触发器二分频得到 500Hz最后再走一遍 1000 分频得到 1Hz。2Hz 用于快速校时校分可以从 1kHz 继续做 500 分频也可以从 1MHz 分频得到具体看实验箱时钟资源和手头芯片。分频链一旦顺序接错后面计时和报时都会偏。目标频率来源主要用途分频实现1MHz48MHz / 48中间时钟两片 74160 置数到 01kHz1MHz / 1000动态扫描、报时三片 74160 级联500Hz1kHz / 2整点报时低音D 触发器二分频2Hz1kHz / 500 或 1MHz 分频快速校时校分74160 模 5001Hz1kHz / 1000秒计数三片 74160 级联用 Verilog 描述 48 分频的等效逻辑比直接画原理图更容易检查边界// 48 分频计数 0~47到 47 时下一拍回 0 module div48( input wire clk_48m, input wire rst_n, output reg clk_1m ); reg [5:0] cnt; always (posedge clk_48m or negedge rst_n) begin if (!rst_n) begin cnt 6d0; clk_1m 1b0; end else if (cnt 6d47) begin cnt 6d0; clk_1m ~clk_1m; // 每 48 个输入周期翻转一次 end else begin cnt cnt 1b1; end end endmodule这里cnt是 6 位因为 47 需要 6 位二进制clk_1m在计数到 47 时翻转保证输出是输入时钟的 48 分频。实际用 74160 时两片级联成 0~47 计数器最高位进位输出作为下一级时钟。注意 74160 的置数端LDN是低有效到 47 时给LDN0下一个脉冲把两片同时置 0。如果只接一片模值会变成 10 或 16后面全错。2.2 模 60 计数器两片 74160 的置数端与毛刺抑制秒和分都是 0~59用两片 74160 级联个位片计 0~9十位片计 0~5。到 59 时十位是 5、个位是 9此时给两片LDN低电平下一拍整体回 0。原理图里常把高电平信号直接参与置数但实际芯片引脚有电平偏移低电平信号如果直接进与门可能因为毛刺提前置数。我一般会把低有效的输出端先取非再和有效的高电平一起送进置数逻辑这样波形干净很多。状态十位 QD QC QB QA个位 QD QC QB QA置数条件 LDN580101100015901011001000000000001行为级 Verilog 可以这样写// 模 60 计数器0~59进位输出 carry module counter60( input wire clk, input wire rst_n, input wire en, output reg [3:0] ones, output reg [3:0] tens, output reg carry ); always (posedge clk or negedge rst_n) begin if (!rst_n) begin ones 4d0; tens 4d0; carry 1b0; end else if (en) begin if (ones 4d9) begin ones 4d0; if (tens 4d5) begin tens 4d0; carry 1b1; // 59 到 00 时产生进位 end else begin tens tens 1b1; carry 1b0; end end else begin ones ones 1b1; carry 1b0; end end end endmoduleen是计数使能接 1Hz 时钟或者校分时的 2Hzcarry在 59 到 00 那一拍拉高正好给下一级分或时计数器当时钟。用 74160 实现时个位片的RCO接十位片的ENT十位片到 5 且个位到 9 时组合出LDN0。仿真波形要重点看 59 之后是不是干净地回到 00中间不能出现 60 或 6A 之类的瞬态。2.3 模 24 计数器与进位链时计数器是 0~23同样两片 74160个位 0~9十位 0~2。到 23 时置 0。注意 23 的十位是 2、个位是 3不是 24。如果置数逻辑写成十位 2 且个位 4就会多计一个数。进位链上秒计数器的carry接分计数器的时钟使能分计数器的carry接时计数器的时钟使能。这样 23:59:59 之后回到 00:00:00。module counter24( input wire clk, input wire rst_n, input wire en, output reg [3:0] ones, output reg [3:0] tens ); always (posedge clk or negedge rst_n) begin if (!rst_n) begin ones 4d0; tens 4d0; end else if (en) begin if (ones 4d9) begin ones 4d0; if (tens 4d2) tens 4d0; else tens tens 1b1; end else if (tens 4d2 ones 4d3) begin ones 4d0; tens 4d0; end else begin ones ones 1b1; end end end endmodule这里把 23 的判断放在ones分支之前避免 23 时先加一变成 24 再回零。实际原理图里 74160 的置数端是同步还是异步要看具体型号74160 是同步置数所以置数信号要在时钟沿之前稳定。仿真时给一个 1Hz 时钟跑 24 小时太慢我一般把使能端接 1kHz 快速跑一遍看进位边界。2.4 仿真波形与常见错误Quartus II 7.0 的波形仿真文件里把clk_48m周期设为 20.833ns仿真时间至少 2ms 才能看到 1kHz 输出想看 1Hz 回零直接把分频链输出clk_1hz接到计时器仿真时间设到 70s 以上。常见错误有三个一是 48 分频的输出接错到 1000 分频的时钟端导致频率除以 48 又除以 1000 变成 1Hz 而不是 1kHz二是 74160 的CLRN悬空芯片一直清零计数器不动三是置数端直接接低电平信号仿真出现窄脉冲计数器偶尔跳两个数。遇到计数跳变先看置数逻辑有没有取非再看时钟线上有没有门控毛刺。3. 清零、校时校分与保持控制通路里的异步信号和防抖3.1 异步清零CLRN 低有效与开关映射74160 的CLRN是异步清零低电平有效不管时钟有没有沿只要CLRN0就回零。所以把六个数码管对应的所有 74160 的CLRN并联接到一个开关RDN上。设计要求RDN1时清零但CLRN是低有效中间必须加一个非门。开关拨到 1非门输出 0计数器全清拨回 0非门输出 1正常计时。RDN 开关非门输出CLRN 电平计时器状态011正常计时100时、分、秒全清零// 异步清零与正常计时的切换 wire clrn_all; assign clrn_all ~rdn_key; // rdn_key1 时清零 always (posedge clk or negedge clrn_all) begin if (!clrn_all) begin ones 4d0; tens 4d0; end else begin // 正常计数逻辑 end endclrn_all直接进 always 的异步复位端综合工具会映射到 74160 的CLRN引脚。注意按键抖动会让CLRN产生毛刺虽然异步清零对毛刺敏感但一般拨动开关抖动时间在毫秒级清零效果肉眼看不出来。如果要求严格可以在开关后加一个 D 触发器做同步。3.2 2Hz 快速校时校分的实现校分开关M_KEY1时分计数器时钟从 1Hz 切到 2Hz秒计数器仍然走 1Hz校时开关H_KEY1时时计数器时钟从 1Hz 切到 2Hz分、秒正常。这里关键是时钟切换不能有毛刺常见做法是用一个二选一多路器选择端接按键两路输入分别是 1Hz 和 2Hz。如果直接用一个与门把 2Hz 和按键相与再和 1Hz 或起来切换瞬间可能出现窄脉冲计数器多走一格。// 校分时钟选择m_key1 时选 2Hz否则选 1Hz wire clk_minute; assign clk_minute m_key ? clk_2hz : clk_1hz; // 校时时钟选择h_key1 时选 2Hz否则选 1Hz wire clk_hour; assign clk_hour h_key ? clk_2hz : clk_1hz;clk_2hz周期 0.5s按一秒两次的速度校分一分钟能走 120 个分够用。校时和校分不建议同时打开否则分和时都快速走很难对准。原理图上可以在两个按键后加互斥逻辑或者干脆在操作时只拨一个。校时校分时秒计数器照常走所以校到 59 秒附近要快一点不然校完分又被秒进位顶掉。3.3 保持电路的门控时钟与 D 触发器防抖保持开关K_KEY1时计时器保持当前时间不变。最直接的做法是不给计数器时钟脉冲即门控时钟clk_gated clk_1hz ~k_key。但组合逻辑门控时钟在按键切换时容易产生毛刺毛刺会被 74160 当成一个时钟沿时间跳一下。更稳的做法是用 D 触发器把k_key同步到时钟域再用同步后的信号去控制时钟使能。// 同步门控用 D 触发器对 k_key 打拍避免毛刺 reg k_key_sync1, k_key_sync2; always (posedge clk_1hz or negedge rst_n) begin if (!rst_n) begin k_key_sync1 1b0; k_key_sync2 1b0; end else begin k_key_sync1 k_key; k_key_sync2 k_key_sync1; end end wire en_counter; assign en_counter ~k_key_sync2; // 保持时使能为 0k_key_sync2是打两拍后的稳定信号en_counter控制计数器的ENT或时钟使能端。用 74160 时可以把en_counter接到ENT和ENP这样时钟还在走但计数器不翻。保持期间数码管仍然动态扫描显示当前冻结的时间。如果实验箱上按键是机械开关k_key本身抖动可能几十毫秒打两拍同步能滤掉大部分。3.4 防抖电路与实验现象校时校分按键同样需要防抖。原文提到用 D 触发器锁存实现防颤具体接法是把按键信号接到 D 端时钟接一个低频信号比如 100HzQ 输出作为稳定的控制信号。这样只有按键稳定超过一个时钟周期输出才变化。实验时如果发现按一下校分分位跳了两三个数基本就是抖动没处理。用示波器看按键波形能看到上升沿和下降沿有一串毛刺加上 D 触发器后毛刺被滤掉波形变成干净的单次跳变。4. 整点报时与动态扫描显示卡诺图化简和 74151/74138 联调4.1 整点报时逻辑5953、55、57 与 5959 的频率选择整点报时要求在 59 分 53 秒、55 秒、57 秒输出 500Hz 低音59 分 59 秒输出 1kHz 高音。触发信号来自分计数器和秒计数器的输出。把分十位、分个位、秒十位、秒个位的 BCD 码展开成二进制对 53、55、57、59 四个时刻做卡诺图化简能得到一个较简的与门网络。常见做法是分别判断分计数器等于 59再判断秒计数器等于 53/55/57/59最后把 500Hz 或 1kHz 送到蜂鸣器。时刻分十位分个位秒十位秒个位输出频率59535953500Hz59555955500Hz59575957500Hz595959591kHz// 整点报时触发与频率选择 wire min_59 (min_tens 4d5) (min_ones 4d9); wire sec_53 (sec_tens 4d5) (sec_ones 4d3); wire sec_55 (sec_tens 4d5) (sec_ones 4d5); wire sec_57 (sec_tens 4d5) (sec_ones 4d7); wire sec_59 (sec_tens 4d5) (sec_ones 4d9); wire beep_low min_59 (sec_53 || sec_55 || sec_57); wire beep_high min_59 sec_59; wire beep beep_low ? clk_500hz : (beep_high ? clk_1khz : 1b0);min_tens、min_ones、sec_tens、sec_ones是计时器输出的 BCD 码beep直接驱动蜂鸣器低音时选 500Hz高音时选 1kHz其余时间静音。卡诺图化简后如果有多余项仿真时可能在其他秒数误响跑一次 59 分 50 秒到 59 分 59 秒的波形就能看出来。4.2 动态显示6 位 BCD 数据的 74151 多路复用六个数码管如果都用静态译码需要六片 7447 和大量连线。实验里只用一个译码显示单元所以采用动态扫描用一片 74151 八选一多路器轮流选择时、分、秒的个位和十位 BCD 数据送到一片 7447 译码再用 74138 三-八译码器控制六个共阳数码管的位选端。扫描计数器用模 6 计数器输出三位二进制低三位接 74138 的 A、B、C同时接 74151 的地址端。扫描频率选 1kHz即每位数码管每 6ms 点亮一次人眼看不到闪烁。扫描计数74151 通道74138 输出点亮数码管显示内容00Y0秒个位秒的个位 BCD11Y1秒十位秒的十位 BCD22Y2分个位分的个位 BCD33Y3分十位分的十位 BCD44Y4时个位时的个位 BCD55Y5时十位时的十位 BCD// 模 6 扫描计数器与动态选择 reg [2:0] scan_cnt; always (posedge clk_1khz or negedge rst_n) begin if (!rst_n) scan_cnt 3d0; else if (scan_cnt 3d5) scan_cnt 3d0; else scan_cnt scan_cnt 1b1; end reg [3:0] bcd_out; always (*) begin case (scan_cnt) 3d0: bcd_out sec_ones; 3d1: bcd_out sec_tens; 3d2: bcd_out min_ones; 3d3: bcd_out min_tens; 3d4: bcd_out hour_ones; 3d5: bcd_out hour_tens; default: bcd_out 4d0; endcase end // 74138 位选低有效对应扫描计数值 wire [5:0] dig_en; assign dig_en ~(6b000001 scan_cnt);scan_cnt每 1ms 加一bcd_out随地址切换7447 译码后输出段码。dig_en的移位写法在综合后就是 74138 的译码逻辑低有效选通对应数码管。实际 74138 只有三个地址输入和八个输出用其中六个即可。注意 74151 的地址和 74138 的地址要接同一个scan_cnt否则数据位和显示位会错位出现“秒个位显示在分十位”的现象。4.3 7447 译码与数码管段码7447 是 BCD 到共阳七段译码器输出低有效。共阳数码管的公共端接高电平段码低电平点亮。如果实验箱是共阴数码管需要换 7448 或者加反相器。段码限流电阻一般 220Ω 到 470Ω太小会烧段太大会暗。动态扫描时每位数码管只亮 1/6 时间亮度比静态低可以把限流电阻取小一点但不要低于 150Ω。BCD 输入显示数字7447 段输出 abcdefg低有效000000000001000111001111001020010010001130000110010041001100010150100100011060100000011170001111100080000000100190000100实验里如果某一段常亮或不亮先量 7447 对应输出脚电压再查数码管公共端有没有接对。动态扫描时如果所有位同时亮但显示内容错多半是 74151 的地址线接反了如果某一位特别暗查 74138 对应输出有没有接限流电阻或三极管驱动。5. 顶层整合与下载验证从 Quartus II 7.0 到 SMART SOPC 实验箱的最后几公里顶层整合时把分频模块、计时模块、控制模块、报时模块和显示模块例化到一个.bdf或 Verilog 顶层里。Quartus II 7.0 对 Verilog-2001 支持够用但引脚分配最好用 Tcl 脚本或.qsf文件比在图形界面一个个点快。下面是一个引脚分配片段把 48MHz 时钟、按键和数码管段位选映射到实验箱的对应引脚# Quartus II 7.0 引脚分配示例实际引脚号以实验箱手册为准 set_location_assignment PIN_23 -to clk_48m set_location_assignment PIN_45 -to rdn_key set_location_assignment PIN_46 -to m_key set_location_assignment PIN_47 -to h_key set_location_assignment PIN_48 -to k_key set_location_assignment PIN_100 -to seg_a set_location_assignment PIN_101 -to seg_b set_location_assignment PIN_102 -to seg_c set_location_assignment PIN_103 -to seg_d set_location_assignment PIN_104 -to seg_e set_location_assignment PIN_105 -to seg_f set_location_assignment PIN_106 -to seg_g set_location_assignment PIN_110 -to dig_en[0] set_location_assignment PIN_111 -to dig_en[1] set_location_assignment PIN_112 -to dig_en[2] set_location_assignment PIN_113 -to dig_en[3] set_location_assignment PIN_114 -to dig_en[4] set_location_assignment PIN_115 -to dig_en[5] set_location_assignment PIN_120 -to beep分配完先跑一次编译看 Fitter 报告里的引脚冲突和时序违规。48MHz 输入如果没接专用时钟脚Quartus 会报警告但实验箱一般有固定时钟脚。下载时用 JTAG 模式把.sof文件烧到 FPGA 里拨动 RDN 看六个数码管是否全灭再松开看是否从 00:00:00 开始走。校分时按住 M_KEY分位应该以 2Hz 快速走秒位仍然正常。整点报时不好等可以把分计数器预置到 59 分 50 秒或者用仿真先验证。附加功能里星期显示可以借用时的进位信号每当时从 23 到 00 时给星期计数器加一秒表功能则用另一个模 100 计数器和模 60 计数器通过界面切换信号选择显示数据源。动态扫描频率如果降到 500Hz六个数码管轮流点亮周期变成 12ms边缘能看到轻微闪烁用这个办法可以快速判断视觉暂留的边界。本文还有配套的精品资源点击获取
返回列表