ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

FPGA数字频率计设计:从时序控制到数码管显示的完整实现

FPGA数字频率计设计:从时序控制到数码管显示的完整实现

简介:本资源是一份面向电子类本科生与FPGA初学者的数字频率计课程设计完整报告,聚焦Verilog HDL在数字系统中的典型应用,解决高频信号(10Hz~10MHz)精准测量与动态显示的工程实践问题。报告涵盖分频器、门控电路、计数器、锁存译码显示等核心模块的Verilog代码设计、ISE仿真波形及ELB实验板(Spartan-3A XC3S200A)实测验证,支持三档可选闸门时间(1s/0.1s/0.01s)、六位数码管kHz单位显示、溢出与闸门状态LED指示等完整功能。压缩包为单个412KB的Word文档(.doc),内容结构清晰,含原理框图、各模块代码与仿真截图、误差分析、技术指标详解及Verilog开发环境说明,便于对照学习与课程设计复现。目前已有706人学习下载,适合数字电路、EDA技术、FPGA开发等课程的实验参考与毕业设计基础支撑。

1. 为什么一个“只能测10Hz~10MHz”的数字频率计,反而成了FPGA初学者最该吃透的硬核练手项目?

不是因为它多高端,而是它把数字系统设计里最典型的“时序-控制-显示”闭环,压缩进了一套可仿真、可下载、可肉眼验证的完整链路里。你用函数发生器调个1kHz正弦波,接上板子,三秒后六位数码管跳出来“001.000”,那一刻你才真正摸到“时间基准怎么变成数字结果”的脉搏——这比背一百遍“频率是单位时间内的周期数”都管用。本方案完全复刻某高校电子科学与技术专业经典课设:基于Spartan-3A XC3S200A FPGA平台,用Verilog HDL从零实现6位十进制数字频率计,覆盖10Hz~10MHz全量程,支持1s/0.1s/0.01s三档闸门时间切换,带溢出指示、闸门状态LED、记忆式扫描显示。所有模块均通过ISE 14.7完成行为级仿真与综合,引脚约束适配ELB实验板硬件资源(共阳七段数码管×6、独立按键×3、复位键×1、LED×2),代码无任何IP核依赖,纯RTL手写,可直接用于毕设答辩、课程设计验收或FPGA工程师入职前的实操自检。如果你正在被“时钟域交叉怎么处理”“锁存器和寄存器区别在哪”“为什么仿真波形对但上板乱码”这些问题卡住,这套方案就是你的第一份可信参考。

2. 总体架构设计:五模块分层结构与信号流闭环验证

数字频率计不是一堆逻辑堆出来的,而是一个精密的时间标尺系统。它的核心矛盾在于:被测信号频率未知(10Hz~10MHz),但你要用固定精度的时基去“卡住”它。这就决定了整个系统必须严格分层——底层提供稳定时钟源,中层生成可控闸门窗口,上层完成计数与锁存,顶层负责人类可读的显示。本方案采用清晰的五模块分层架构,每个模块职责单一、接口明确、仿真可隔离,避免初学者常犯的“一写就全连、一错全崩”问题。

2.1 模块划分与数据流向:从石英振荡到数码管点亮

整个系统以50MHz主晶振为源头,经分频模块生成四路时基信号(1Hz/10Hz/100Hz/1kHz);门控电路根据按键选择其中一路作为闸门时间基准,并生成精确的gate_out1使能信号;计数器在gate_out1高电平期间对被测信号clk_in进行累加;锁存模块在闸门关闭瞬间将计数值捕获并暂存;最后由扫描显示模块将六位BCD码逐位译码、动态扫描输出至数码管。关键信号流如下:

  • 时钟路径:clk (50MHz) → count模块 → clk_1khz/clk_100hz/clk_10hz
  • 控制路径:key1/key2/key3 → chose模块 → ff[2:1](档位编码) + gate_out1(闸门使能) + clk_latch(锁存触发) + clk_clear(清零脉冲)
  • 数据路径:clk_in → counter模块 → out1~out6(六位BCD) → v138模块 → latch1~latch6(锁存值) → segs(段码) + se(位选)
  • 状态反馈:yichu(溢出标志)→ LED;gate_out1 → 闸门LED

这种分离式设计让调试变得极其直观:若显示全0,先查gate_out1是否有效;若数值跳变剧烈,重点看clk_latch边沿是否与计数器停止时刻对齐;若某位数码管常亮不灭,大概率是se位选信号未按1kHz节奏轮询。每一环都可单独仿真验证,无需等整板联调。

2.2 顶层模块(top):接口定义与实例化规范

顶层模块是整个系统的“总线接口”,它不参与逻辑运算,只负责信号粘合与端口映射。其设计必须严格遵循硬件约束,尤其是时钟域和复位域的一致性。以下是精简后的top模块关键代码及说明:

module top( input rest, // 全局异步复位(低电平有效) input clk, // 主时钟50MHz(来自FPGA晶振) input clk_in, // 被测信号输入(需预整形为方波) input key1, key2, key3, // 三档闸门选择按键(互斥,高电平有效) output dp, // 小数点控制(仅在特定档位点亮) output led, // 闸门状态LED(gate_out1同步) output en, // 数码管使能(共阳极,低电平点亮) output yichu, // 溢出指示LED(高电平有效) output [3:1] se, // 位选信号(3位,驱动6位数码管需译码) output [7:1] segs // 段码输出(7位,对应a-g段) ); // 中间信号声明(全部为wire类型,禁止reg) wire [4:1] out1,out2,out3,out4,out5,out6; // 六位BCD计数值 wire [2:1] ff; // 档位编码(00=无效,01=1s,10=0.1s,11=0.01s) wire gate_out1; // 闸门使能信号(高电平期间计数) wire clk_latch, clk_clear; // 锁存与清零时钟(由chose模块生成) // 实例化各子模块(注意端口顺序与名称严格匹配) count uut_count ( .clk(clk), .rest(rest), .clk_10hz(clk_10hz), // 分频输出10Hz(对应0.1s闸门) .clk_100hz(clk_100hz), // 分频输出100Hz(对应0.01s闸门) .clk_1khz(clk_1khz) // 分频输出1kHz(用于扫描显示) ); chose uut_chose ( .rest(rest), .clk_1khz(clk_1khz), // 扫描时钟(非闸门时钟!) .clk_10hz(clk_10hz), .clk_100hz(clk_100hz), .key1(key1), // 注意:原文中chose模块端口名为ky1/key10/key100,此处已统一为key1/key2/key3 .key10(key2), .key100(key3), .gate_out1(gate_out1), .ff(ff), .clk_latch(clk_latch), .clk_clear(clk_clear) // 原文拼写为clk_cear,此处已修正 ); counter uut_counter ( .rest(rest), .start(gate_out1), // 闸门开启即开始计数 .clk_in(clk_in), .cnt1(out1), .cnt2(out2), .cnt3(out3), .cnt4(out4), .cnt5(out5), .cnt6(out6), .yichu(yichu), .clk_clear(clk_clear) ); v138 uut_v138 ( .rest(rest), .clk_1khz(clk_1khz), // 显示扫描时钟 .se(se), .led(led), // 闸门LED直连gate_out1,此处led为输出 .in1(out1), .in2(out2), .in3(out3), .in4(out4), .in5(out5), .in6(out6), .segs(segs), .ff(ff), .en(en), .dp(dp), .clk_latch(clk_latch) ); endmodule

提示:端口命名一致性是调试第一道关卡
原始报告中chose模块输入端口名为ky1/key10/key100,而顶层调用时写成key1/key2/key3,极易导致综合后信号悬空。本方案强制统一为key1/key2/key3,并在注释中标明对应关系(key1=1s档,key2=0.1s档,key3=0.01s档)。所有模块实例化时,务必使用.port_name(signal)的显式连接方式,杜绝位置式连接(如uut_count(clk,rest,...)),这是避免引脚错位的根本方法。

2.3 时钟域划分:为什么1kHz扫描时钟不能和闸门时钟混用?

这是初学者最容易栽跟头的地方。本系统存在三个物理时钟域:

  • 主时钟域(50MHz):驱动分频器计数器,要求最高稳定性;
  • 闸门时钟域(1Hz/10Hz/100Hz):由分频器产生,用于生成gate_out1,决定测量精度;
  • 显示时钟域(1kHz):专供扫描显示模块,保证人眼无闪烁。

关键设计原则:不同功能的时钟绝不共用。例如,若用10Hz信号直接驱动数码管扫描,人眼会看到明显闪烁;若用1kHz信号去控制闸门,测量分辨率将暴跌至1ms(仅支持1kHz以上信号)。原文中chose模块错误地将clk_1khz作为敏感信号生成gate_out1,实际应使用clk_10hz/clk_100hz/clk_1khz中与档位匹配的那一路。本方案在chose模块内部做了时钟选择逻辑,确保gate_out1的周期严格等于所选档位(1s/0.1s/0.01s),而clk_latch和clk_clear则由gate_out1的边沿二次分频生成,与扫描时钟完全解耦。这种跨时钟域信号传递必须通过两级寄存器同步(metastability resolution),但鉴于本项目所有跨域信号均为慢速控制信号(<100Hz),且FPGA规模较小,原文未做同步处理亦可工作——不过在工业级设计中,此处必须补上同步器。

3. 核心模块实现:分频、门控、计数、锁存、显示的RTL细节

每个模块都不是黑匣子,它的每一行代码都在解决一个具体工程问题。下面逐模块拆解关键实现逻辑、参数计算依据及可复现的仿真要点。

3.1 分频模块(count):如何从50MHz得到精准的1Hz/10Hz/100Hz/1kHz?

分频的本质是计数器。给定输入时钟clk=50MHz,要得到clk_out=1Hz,需对50,000,000个输入时钟周期计数一次。但直接写if(count==49999999)会产生巨大组合逻辑延迟,影响时序收敛。原文采用29位计数器(最大值536,870,911),分四路分别计数,每路用翻转触发(~clk_xxx)降低功耗。我们来验算关键参数:

  • clk_1Hz:目标分频比 = 50,000,000 / 1 = 50,000,000
    原文count1==24000000→ 实际分频比 = 2 × 24,000,000 = 48,000,000 → 误差 = (50M-48M)/50M = 4%
    修正方案:将count1==24999999(25,000,000次计数,翻转得1Hz),代码如下:
// 修正后的count模块关键段(仅展示clk_1Hz部分) reg [24:0] count1; // 25位足够表示25,000,000(2^25=33,554,432) always @(posedge clk or negedge rest) begin if (!rest) begin clk_1hz <= 0; count1 <= 0; end else begin if (count1 == 24999999) begin // 计满25,000,000个周期 count1 <= 0; clk_1hz <= ~clk_1hz; // 翻转,周期变为50,000,000个输入周期 end else count1 <= count1 + 1; end end

设计说明:

  • 使用negedge rest实现同步复位更安全,但原文为异步复位,为保持兼容性,此处仍用or negedge rest;
  • count1位宽从[29:0]缩减至[24:0],节省FPGA资源;
  • 其他三路(10Hz/100Hz/1kHz)同理修正:clk_10Hz需计count2==2499999(2.5M),clk_100Hz需count3==249999(250K),clk_1kHz需count4==24999(25K)。
  • 仿真时,在Testbench中设置clk周期为20ns(50MHz),运行足够长时间(>1s),用ModelSim观察clk_1hz波形,确认高/低电平各持续约1秒。

3.2 门控电路模块(chose):三档按键如何生成无毛刺的闸门信号?

按键是机械开关,存在抖动(bounce),直接用于控制闸门会导致gate_out1频繁启停,计数结果严重失真。原文未做消抖,属于教学简化。但在真实项目中,必须加入硬件消抖。本方案在chose模块内嵌入两级同步+计数消抖逻辑:

// chose模块新增消抖逻辑(插入在按键采样后) reg [12:0] key1_d, key2_d, key3_d; // 13位计数器,约26us消抖窗口(50MHz下) reg key1_sync, key2_sync, key3_sync; // 同步第一级 always @(posedge clk_1khz or negedge rest) begin if (!rest) key1_sync <= 0; else key1_sync <= key1; end // 同步第二级(抗亚稳态) reg key1_meta; always @(posedge clk_1khz or negedge rest) begin if (!rest) key1_meta <= 0; else key1_meta <= key1_sync; end // 消抖计数(仅当按键状态稳定时计数) always @(posedge clk_1khz or negedge rest) begin if (!rest) key1_d <= 0; else if (key1_meta == key1_sync) begin // 状态稳定 if (key1_d < 13'd8191) key1_d <= key1_d + 1; // 达到阈值即认为有效 else key1_d <= 13'd8191; end else key1_d <= 0; // 状态变化,重置计数 end // 最终按键信号(高电平有效且无抖动) wire key1_debounced = (key1_d == 13'd8191) ? 1'b1 : 1'b0; // key2_debounced, key3_debounced 同理

参数说明:

  • clk_1khz作为消抖时钟,13位计数器最大值8191,对应消抖时间 = 8191 × 1ms ≈ 8.191s?不对!这里暴露一个关键错误:clk_1khz周期是1ms,但消抖需要微秒级响应。正确做法是用更高频时钟(如50MHz)做消抖。本方案修正为:消抖逻辑跑在clk(50MHz)下,计数器阈值设为13'd25000(25,000 × 20ns = 500μs,典型按键抖动时间)。
  • 消抖后,再用case语句生成ff和gate信号。原文中gate直接赋值为clk_10hz等,但clk_10hz是10Hz方波,而闸门需要的是单次脉冲(如1s高电平)。因此,gate应由clk_xxx边沿触发的单周期脉冲生成,这才是真正的“门控”。

3.3 计数器模块(counter):六位BCD计数器的溢出保护与清零时机

计数器是频率计的核心,其设计直接决定量程上限。原文采用六级级联的4位BCD计数器(cnt1~cnt6),最大计数值为999,999。当被测信号频率为10MHz、闸门时间为0.01s时,理论计数值 = 10^7 × 0.01 = 100,000,远低于999,999,故六位足够。但溢出判断逻辑有硬伤:

原文判断溢出条件为:

if((cnt6==4'b1001)&&(cnt5==4'b1001)&&...&&(cnt1==4'b1001)) begin cnt1<=4'b0000; ... ; yichu<=0; end

这表示只有计满999,999才溢出,但实际需求是:只要计数值超过当前闸门时间能表示的最大值,就应报溢出。例如,闸门为0.01s时,最大可测频率为100MHz(100M×0.01=1M),但计数器最大值999,999 < 1,000,000,所以当计到999,999时,真实频率已≥10MHz,此时应立即溢出。因此,溢出信号yichu应在计数器达到999,999时拉低(原文yichu<=0表示溢出,但初始值yichu=1,逻辑反了!),且清零动作必须在clk_clear上升沿完成,而非在计数进程中。

修正后的关键段:

// 溢出检测(在clk_in上升沿采样) wire overflow_detect = (cnt6==4'b1001 && cnt5==4'b1001 && cnt4==4'b1001 && cnt3==4'b1001 && cnt2==4'b1001 && cnt1==4'b1001); always @(posedge clk_in or negedge rest) begin if (!rest) begin yichu <= 1'b1; // 初始为1,表示未溢出 // 所有cnt清零 cnt1 <= 4'b0000; cnt2 <= 4'b0000; ... cnt6 <= 4'b0000; end else if (clk_clear) begin // 清零信号到来时强制归零 cnt1 <= 4'b0000; cnt2 <= 4'b0000; ... cnt6 <= 4'b0000; yichu <= 1'b1; // 清零后溢出标志复位 end else if (start) begin // 仅在闸门开启时计数 if (overflow_detect) begin cnt1 <= 4'b0000; cnt2 <= 4'b0000; ... cnt6 <= 4'b0000; yichu <= 1'b0; // 溢出!拉低 end else begin // 正常BCD进位逻辑(此处省略详细进位代码,与原文一致) end end end

血泪经验:

  • yichu信号极性必须与硬件LED匹配。原文说“溢出时做溢出指示”,即LED亮表示溢出,故yichu应为高电平有效。但原文代码yichu<=0且初始yichu=1,逻辑混乱。本方案统一为yichu=1'b1表示未溢出,yichu=1'b0表示溢出,硬件连接时LED阳极接VCC,阴极接yichu,即可实现“溢出亮灯”。
  • clk_clear必须是单周期脉冲,否则计数器会持续清零。原文中clk_clear由门控电路在count==13时生成,但未说明其宽度。在仿真中,需确保clk_clear为严格一个clk_1khz周期的高脉冲。

3.4 锁存与扫描显示模块(v138):为什么必须“锁存”?动态扫描如何防串扰?

“锁存”是数字频率计区别于普通计数器的关键。原文要求:“在一次测试结束时,显示测试结果,此显示值一直保留到下次测量显示数到来”。这意味着:计数器在闸门期间疯狂累加,但显示模块看到的必须是闸门关闭瞬间的最终值,且该值要稳定显示直到下次更新。若不锁存,数码管会随计数器实时跳变,人眼无法读取。

原文v138模块用always @(posedge clk_latch)捕获计数值,这是正确的。但其位选逻辑有缺陷:count变量在clk_1khz下自增,但未限制范围,可能导致count溢出后se输出非法值。修正如下:

// 位选计数器(严格6位循环) reg [2:0] count; // 3位足够表示0~5(6个数码管) always @(posedge clk_1khz or negedge rest) begin if (!rest) count <= 0; else count <= count + 1; end // 位选输出(直接映射,无需译码) assign se = count[2:0]; // 输出3位,由外部译码器(如74LS138)转为6位选通 // 或者直接驱动6位数码管(若板载为共阳极,需反相) // assign se = {1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}; // 此处需根据硬件原理图确定

避坑:小数点(dp)控制逻辑的档位适配
原文要求“以kHz为单位显示”,即1s档显示XXX.XXX kHz,小数点在第4位;0.1s档显示X,XXX.X kHz,小数点在第3位;0.01s档显示XX,XXX kHz,小数点在第2位。但原文dp逻辑为:

if(ff==2'b01&&se==3) dp<=0; // 1s档,第4位(se==3对应第4位,因se从0开始) else if(ff==2'b10&&se==2) dp<=0; // 0.1s档,第3位 else if(ff==2'b11&&se==1) dp<=0; // 0.01s档,第2位

这逻辑正确,但se值需与位选硬件匹配。若se为3位二进制,se==3即3'b011,对应第4位(索引从0开始),符合要求。仿真时,可设置ff=2'b01(1s档),观察dp信号在se==3时是否拉低。

4. 常见问题排查:五个让FPGA新手彻夜难眠的翻车现场

写完代码只是开始,上板调试才是真正的试炼场。以下五条是某实验室近三年课设中出现频率最高的问题,每一条都附带现象、根因和可立即执行的解决方案。

4.1 现象:数码管全暗或全亮,按键切换档位无反应

原因:引脚约束文件(UCF)中,数码管段码(segs)或位选(se)的管脚分配错误,或未正确设置I/O标准(如应为LVTTL却设为LVCMOS)。
解决:

  1. 打开ISE中的“Assign Package Pins”工具,核对ELB实验板原理图,确认segs[7:1]对应FPGA的哪7个引脚(通常为P42,P41,P39,P38,P37,P36,P35),se[3:1]对应哪3个引脚(如P34,P33,P32);
  2. 在UCF文件中,为每个信号添加精确约束,例如:
    NET "segs<0>" LOC = P42 | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST; NET "se<0>" LOC = P34 | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST;
  3. 综合后查看“Design Summary”,确认所有I/O端口均已成功约束(No Unconstrained I/O Ports)。

4.2 现象:闸门LED常亮不灭,或完全不亮

原因:gate_out1信号未正确连接至LED,或led端口在顶层模块中被误定义为input(应为output)。
解决:

  1. 检查顶层模块端口声明:output led;
  2. 检查v138模块中led的赋值:原文为led<=gate_out1,但gate_out1是闸门使能信号,高电平期间LED应亮,符合要求;
  3. 若LED仍不亮,用万用表测FPGA对应引脚电压,确认是否输出高电平;若常亮,检查gate_out1波形——可能门控电路逻辑错误导致其恒为高。

4.3 现象:计数器数值缓慢爬升,远低于理论值(如输入1MHz,显示仅100)

原因:被测信号clk_in未经过整形电路,仍是正弦波或占空比极不规则的脉冲,FPGA的IOB无法可靠采样。
解决:

  1. 在FPGA板外增加一级比较器(如LM339)或施密特触发器(如74HC14),将正弦波整形为标准方波;
  2. 若直接接入,确保clk_in信号幅度在FPGA的VIH/VIL范围内(LVTTL:VIH≥2.0V,VIL≤0.8V);
  3. 在仿真中,Testbench必须用initial块生成理想方波,而非正弦波。

4.4 现象:切换闸门档位时,显示数值跳变剧烈,甚至出现负数

原因:锁存信号clk_latch与闸门关闭时刻未对齐,导致捕获到中间态计数值。
解决:

  1. 在门控电路中,clk_latch必须在gate_out1下降沿后一个clk_1khz周期生成(原文中count==11生成clk_latch,但未说明与gate_out1的相位关系);
  2. 修改chose模块,用always @(negedge gate_out1)触发clk_latch生成;
  3. 仿真时,用ModelSim添加gate_out1和clk_latch波形,确认clk_latch上升沿发生在gate_out1下降沿之后,且两者间隔大于10ns。

4.5 现象:1s档测量准确,但0.1s档显示值为1s档的1/10,0.01s档为1/100

原因:档位选择信号ff未正确传递至显示模块,导致小数点位置和数值缩放逻辑失效。
解决:

  1. 检查顶层模块中ff信号是否从chose模块正确引出,并连接至v138模块;
  2. 检查v138模块内dp逻辑,确认ff值与se值的比较条件正确;
  3. 关键验证:在Testbench中,手动设置ff=2'b01(1s档),观察dp是否在se==3时拉低;设ff=2'b10(0.1s档),观察dp是否在se==2时拉低。

5. 验收与答辩:一份能让导师当场点头的交付清单

验收不是走流程,而是证明你真正理解了每一个信号的意义。我带过三届课设,发现学生最容易在答辩时被问倒的,从来不是“这个模块怎么写”,而是“为什么这里必须这样设计?换一种会怎样?” 所以,你的交付物必须包含三层证据:可运行的代码、可复现的仿真波形、可触摸的硬件现象。下面是我给A同学的验收清单,他最终拿了优秀,现在这份清单成了实验室模板。

5.1 代码交付:五份模块+一份顶层,命名与注释必须像工程文档

不要交一个叫“freq.v”的文件。必须拆分为:

  • count.v:分频模块,开头注释写明输入时钟频率、各输出频率及分频比计算过程(如“clk_1Hz: 50MHz → 1Hz, 分频比=50,000,000, 计数器阈值=24999999”);
  • chose.v:门控模块,注释标明ff编码表(2'b01=1s,2'b10=0.1s,2'b11=0.01s)及clk_latch生成时序图;
  • counter.v:计数器模块,注释强调溢出逻辑(“溢出条件:计数值≥999,999,此时yichu拉低”);
  • v138.v:显示模块,注释说明位选se与数码管物理位置的对应关系(“se=3'b000→最右位,se=3'b101→最左位”);
  • top.v:顶层模块,注释列出所有引脚约束对应的FPGA物理引脚号(如“segs[0]→P42, se[0]→P34”);
  • freq_tb.v:Testbench文件,内含三组测试用例(1kHz/100kHz/1MHz输入,分别配1s/0.1s/0.01s档位)。

提示:注释不是写给机器看的,是写给三个月后的你自己看的
我曾见过学生在答辩前一周改了counter.v的溢出条件,却忘了更新注释,结果导师指着注释问“你写的‘溢出条件为999,999’,但代码里是999,998,哪个对?”,当场卡壳。从那以后,我每次改代码,第一件事就是更新注释,第二件事是运行一遍相关Testbench,第三件事是截图波形存档。

5.2 仿真波形交付:三张关键截图,直击设计灵魂

答辩时,导师不会看你几百行代码,但一定会看你三张波形图。这三张图必须用ModelSim导出为PNG,嵌入报告,且每张图下方标注观测点、时间轴、关键事件标记:

图号观测点时间轴关键事件标记说明
Fig.1clk,clk_1hz,gate_out10~2.5sT=0:gate_out1上升沿;T=1s:gate_out1下降沿;T=1.001s:clk_latch上升沿证明闸门时间精准为1s,且锁存信号在闸门关闭后及时触发
Fig.2clk_in(1MHz),gate_out1,out1~out60~1.2sT=0:gate_out1上升;T=1s:gate_out1下降;T=1.001s: 六位BCD值锁定为001000证明计数器在闸门内准确计得1,000,000个脉冲,且锁存后不再变化
Fig.3clk_1khz,se,dp,segs0~5msT=0:se=0,dp=1;T=1ms:se=1,dp=1;T=3ms:se=3,dp=0(小数点亮)证明扫描时钟驱动

本文还有配套的精品资源,点击获取

返回列表