☰
CB4CLE模7计数器、模5分频与1110010序列生成实验方案
2026/11/6 4:24:51 网站建设 项目流程

简介:这份PDF实验报告面向具备电工电子基础的大专院校学生与数字电路初学者,围绕计数与分频电路的设计、仿真和波形分析展开,可用于实验预习、报告撰写与ISE 14.7操作复盘。内容以CB4CLE计数器实现M=7计数器,对比置零法与置最大数法,并设计N=5整数分频电路,利用数据选择器产生“1110010”序列信号,配有状态转移表、原理图、仿真与手绘波形及实验小结,突出反馈逻辑与时序特性的验证。资源包共1个PDF文件,大小约7.87MB,适合按实验环节查阅电路图与波形记录。已有259人学习,便于读者对照完成设计、排查反馈逻辑错误并巩固数字电路分析方法。

1. 从实验台前的那块板子说起:计数与分频电路要交付的到底是什么

数字电路实验做到计数器这一节,卡住人的往往不是原理,而是“怎么把它变成一份能仿、能测、能上台讲清楚的完整方案”。一份电工电子基础实验的计数与分频电路报告,任务写得很直白:用 CB4CLE 设计 M=7 的计数器,置零法和置最大数法各做一套;设计 N=5 的整数分频电路;用数据选择器产生“1110010”序列;最后交仿真波形、手绘波形和示波器实测波形三套证据。工具是 ISE 14.7,硬件是电工电子综合实验箱加示波器。

这套东西的价值不在“做完”,而在于它把数字电路里最难自证的两件事——逻辑功能和时序特性——用波形固定下来。适合正在做电工电子实验、数字电路课程设计的学生,也适合需要给新人一套可复现验证流程的带教者。下面按需求拆解、器件选型、两套计数器实现、分频与序列生成、避坑排查、验收答辩的顺序,把这份方案拆开。

2. 需求拆解与方案选型:三个任务、两类器件、一条设计主线

2.1 三个任务的技术边界:模 7 计数、模 5 分频、七位序列

把实验指导书上的三行任务翻译成工程语言,它们的输入输出其实非常清晰。第一个任务,输入一个时钟,输出 3 位二进制码,状态在 0~6 之间循环,一共 7 个稳定状态,这就是模 7 计数器。第二个任务,输入一个时钟,输出一个周期为输入时钟 5 倍的信号,频率变成原来的五分之一,本质是把模 5 计数器的某个状态位引出来当输出。第三个任务,输入一个时钟,输出 7 位固定序列“1110010”循环,每一位占一个时钟周期,本质是一个受计数器状态控制的组合逻辑查表。

三个任务的共同点在于:它们都建立在“计数器 + 反馈逻辑”这个骨架上,区别只在反馈条件怎么定、输出从哪儿取。抓住这一点,后面所有的接线都不是死记硬背,而是从状态转移表推出来的。模 7 需要 7 个状态,模 5 需要 5 个状态,七位序列需要 7 个地址,数字不同,方法完全一致。

有一个容易忽略的边界条件必须先定下来:时钟从哪来。实验箱上的晶振一般有分档输出,几赫兹到几十千赫兹不等。做计数器验证时用低频档,肉眼能看 LED 一位一位跳;做分频和示波器观测时换到较高档,否则波形刷新太慢,示波器上根本抓不住稳定图形。这个选择在动手之前就要确定,不要等接完线才发现时钟太快,LED 亮成一片,看不出哪个状态。

2.2 器件与工具选型:CB4CLE、八选一选择器与 ISE 14.7 的配合

CB4CLE 在实验箱的宏器件库里是一个 4 位二进制计数器,常见端口有时钟 CLK、使能 CE、清零 CLR、同步置数 LOAD、4 位数据输入 D3~D0、4 位输出 Q3~Q0,以及进位或借位输出。不同版本的库元件命名可能差一两个字,接之前双击元件看一眼引脚名,比凭记忆接线可靠得多。选它而不是自己用触发器搭,理由很实际:实验课时有限,触发器搭四位计数器要连一堆线,一个接触不良就够查半节课,而宏器件的内部逻辑已经验证过,能把精力放在反馈逻辑的设计上。

数据选择器选八选一,因为它正好有 3 根地址线,能覆盖模 7 计数器的 7 个状态,多出来的那一路接地或者接固定电平即可。用译码器加门电路也能实现同样的序列,但门电路一多,接线错误率直线上升,八选一相当于把一张真值表直接固化进芯片,改序列只需要改数据端的接法,不动地址侧,这在需要反复试错的实验里很省时间。

软件侧用 ISE 14.7,流程是新建工程、选器件型号、原理图输入、综合、实现、生成下载文件,中间穿插 ISim 仿真。这套流程老旧但稳定,实验箱配套的器件库也只在这个版本下能直接调用。有一点要提前说明:原理图输入和 HDL 输入在工程里可以共存,把宏器件当黑盒例化,外面套一层自己写的顶层,既能用现成器件,又能用代码描述反馈逻辑,比纯拖线更清楚。

2.3 从状态转移表到反馈函数:一条能复用的设计主线

所有任意模值计数器的设计,走的都是同一条路:先列状态转移表,再从表里找出“该回绕的那一个状态”,把这个状态译码成反馈信号,送回清零端或置数端。模 7 就是把 7 个状态写出来,看第 8 个该出现什么;模 5 同理。这一步纸面上五分钟,但它决定了后面所有接线的对错。

列完表之后是写反馈函数。以置零法为例,如果器件是同步置数,那么状态 6(110)会稳定存在一个完整时钟周期,第 7 个时钟沿到来时才装入 0,反馈条件就是 Q2·Q1;如果器件是异步清零,状态 6 一出现就立刻被抹掉,它只存在纳秒级,实际稳定状态只剩 6 个,模值就变成 6 了,这时必须改成检出 7(111),反馈函数是 Q2·Q1·Q0。这一个状态的差别,是这类实验里最高频的翻车点,后面还会专门讲。

反馈函数写出来之后,接线就是把与门、非门按式子连起来,输出接到 LOAD 或 CLR。整个过程可以总结成一句:状态表定边界,反馈函数定触发点,波形验证定成败。三块电路都按这个套路走,不需要另起炉灶。

3. 模 7 计数器设计:置零法与置最大数法的两套实现

3.1 置零法:全零置数端与 Q2·Q1 反馈置数

置零法的核心动作是“数到某个值就回到零”。数据输入端 D3D2D1D0 全部接地,等于预设了一个“回家”的目标——0。计数器从 0000 开始往上数,数到 0110 时,反馈逻辑产生一个置数信号送到 LOAD 端,下一个时钟沿把 0000 重新装进去,于是状态在 0~6 之间循环,正好 7 个。

状态转移关系如下表,置零法的 7 个稳定状态全部落在低三位,最高位 Q3 恒为 0,这也是为什么反馈函数只需要看 Q2 和 Q1。

时钟沿置零法 Q3Q2Q1Q0置最大数法 Q3Q2Q1Q0
000001111
100011110
200101101
300111100
401001011
501011010
601101001
7(回绕)00001111

反馈函数写作 L = Q2·Q1,低电平有效时取反,接到器件的置数端。这里要注意极性问题:多数宏器件的 LOAD 是低有效,也就是说“该装数了”的时候要给它一个 0,所以真正接上去的可能是 L̄ = ¬(Q2·Q1)。很多人仿真波形一直不对,就是极性接反,置数信号常年有效,计数器卡在 0 不动。

用 Verilog 描述同一套逻辑,可以更直观地看到它在做什么。这段代码不是要替代原理图,而是作为对照,帮助确认自己连的线与设计意图是否一致。

// 模7计数器:置零法(同步置数,计到6后下一拍回0) module cnt_mod7_load0 ( input wire clk, input wire rst_n, output reg [3:0] q ); // 反馈条件:计到 0110 时拉高 load_en wire load_en = (q == 4'b0110); always @(posedge clk or negedge rst_n) begin if (!rst_n) q <= 4'b0000; // 复位直接归零 else if (load_en) q <= 4'b0000; // 等价于把全0置数端装入 else q <= q + 4'b0001; end endmodule

代码里的load_en对应硬件上的反馈与项,q <= 4'b0000对应 D3~D0 全接地的置数动作。把它和原理图对照着看,就能明白为什么数据端全接 0——因为回绕的目标就是 0,置数端接什么,回绕后就回到什么。

3.2 置最大数法:预置 1111 与 1001 检出

置最大数法走的是另一条路:不从 0 往上数,而是从最大值往下数。数据端 D3D2D1D0 全部接高电平,预置数为 1111,计数器做减法,状态依次是 15、14、13、12、11、10、9,共 7 个,数到 1001 时反馈逻辑动作,下一个时钟沿重新装入 1111。

反馈检出的是 1001 这个状态,写成与项是 Q3·Q2̄·Q1̄·Q0,低有效时取反后送 LOAD。布线时这条链路上有三个输入参与与运算,比置零法的两项多一级,走线也更容易出错,接完一定要用单步时钟或者低速时钟一格一格点过去,确认只有 1001 那一拍置数信号才动作。

// 模7计数器:置最大数法(预置1111,减法计数到1001后回绕) module cnt_mod7_loadmax ( input wire clk, input wire rst_n, output reg [3:0] q ); // 检出 1001:只有这一拍触发重新置数 wire load_en = (q == 4'b1001); always @(posedge clk or negedge rst_n) begin if (!rst_n) q <= 4'b1111; // 初始装入最大数 else if (load_en) q <= 4'b1111; // 回到最大数,重新开始递减 else q <= q - 4'b0001; // 减法计数 end endmodule

如果手上的宏器件只支持加法计数、没有减法模式,这套方案也能迁移:把预置数改成 1001,让它从 9 加到 15,同样 7 个状态,反馈条件改成检出 1111。模值不变,只是计数方向和回绕点换了位置,状态表重画一遍即可。

3.3 两种方法的对照与选用:状态数、译码成本与扩展性

两套方法都能得到模 7,差别在成本和适用面。置零法只用两个输入做与运算,逻辑最简单,占用资源最少,缺点是所有状态都挤在 0000~0110 这一段,高位恒为 0,一旦需要从输出直接译码出某个中间状态,可用的码字空间被压缩了。置最大数法的反馈项有四个输入,逻辑深一级,但它把 7 个状态铺在 1001~1111 这段,码字分布更分散,后续如果要在这个计数器基础上再挂译码电路,可选的编码更宽松。

从扩展性看,置零法改模值最方便:想改成模 6,只把检出条件从 0110 改成 0101,一根线的事。置最大数法改模值要同时动预置数和检出点,牵一发动全身。所以在实验报告里我一般建议:以置零法为主方案讲清原理,置最大数法作为对照方案证明自己理解了两条路径的区别,答辩时被问到“为什么不用另一种”,能说出上面这段取舍,分数就稳了。

还有一个细节值得单独提:两套电路的初始状态不一样。置零法复位后是 0000,置最大数法复位后是 1111,这意味着两者的第一个循环可能不完整——如果仿真从任意时刻开始,置最大数法的第一个周期只跑了半截。仿真激励里要留够时间,或者显式给一个复位脉冲把初值钉死,否则波形图上第一段永远对不上手绘的那张。

4. 分频与序列信号生成:模 5 分频电路与数据选择器的协同

4.1 N=5 整数分频:把周期拉长五倍的实现路径

分频比 N=5 的意思是输出周期等于输入时钟周期的 5 倍,也就是频率变成五分之一。实现方式很直接:做一个模 5 计数器,让它每来 5 个时钟回到起点,然后从计数器的状态里取一位当输出。

模 5 的状态是 0、1、2、3、4,数到 4(100)时触发置数,反馈函数只取 Q2 一项,L = Q2。这比模 7 还简单,因为 4 的二进制是 100,最高位为 1、低两位为 0,一个与项就够了。数据端同样全接 0,回到 0000 重新开始。

// 模5分频:每5个时钟输出一个周期 module div5 ( input wire clk, input wire rst_n, output wire clk_out, output reg [2:0] q ); wire load_en = (q == 3'd4); // 检出 100 always @(posedge clk or negedge rst_n) begin if (!rst_n) q <= 3'd0; else if (load_en) q <= 3'd0; // 回到 0,开始下一轮 else q <= q + 3'd1; end assign clk_out = q[2]; // 取最高位,占空比 1/5 endmodule

这里有个必须说清楚的点:取 Q2 做输出,周期确实变成了 5 倍,但高电平只在一个时钟周期内有效,占空比是 1/5,不是 50%。如果实验只考察分频比,看周期就够了;如果评分标准里写了“输出应为方波”,那就要把输出改成状态译码,让状态 0 和 1 期间输出高、2 到 4 期间输出低,占空比变成 2/5,或者后面再接一级二分频把占空比拉回 50%,代价是总分频比变成 10。这个取舍在动手前就要和评分要求对齐,别等测完波形才发现“频率对了但形状不对”。

示波器观测时,双通道一路接输入时钟、一路接输出,用输入去触发输出,才能看到稳定的相位关系。单通道自由触发的话,两路信号各扫各的,屏幕上永远在跑,抓不到图。

4.2 八选一数据选择器输出“1110010”:卡诺图降维的实际含义

序列信号发生器要输出的是 7 位循环码“1110010”,每一位占一个时钟周期。用模 7 计数器提供地址,用八选一数据选择器做查表,输出就是序列本身。

地址与数据的对应关系如下。计数器状态 000 到 110 依次对应序列的第 1 位到第 7 位,第 8 个地址 111 在模 7 里不会出现,数据端接 0 即可,属于无关项。

计数器状态 A2A1A0对应序列位数据端取值
000第 1 位 = 1D0 = 1
001第 2 位 = 1D1 = 1
010第 3 位 = 1D2 = 1
011第 4 位 = 0D3 = 0
100第 5 位 = 0D4 = 0
101第 6 位 = 1D5 = 1
110第 7 位 = 0D6 = 0
111不出现D7 = 0(无关项)

所谓“画卡诺图后降维”,说的是把这个问题从时序层面压到组合层面。原本要在时间轴上记住 7 个连续的输出值,画成以 A2A1A0 为变量的卡诺图之后,7 个时刻被压缩成 3 变量空间里的 7 个格点,每个格点填 0 或 1,化简之后直接得到数据端的接法。降维降的是变量的维度,不是信息的维度——7 位信息一位没少,只是换了一种更省器件的表达方式。

如果不用数据选择器,也可以从卡诺图化简出一个与或表达式,用门电路搭。以这组序列为例,化简后大约是三到四个与项相或,门数不算多,但接线点密集,实验箱上很容易碰掉一根线。八选一的优势就在这里:把组合逻辑固化进芯片内部,外部只剩地址线和数据线的连接,出错面小,改序列也只需要拨数据端的电平。

4.3 卡诺图降维落地:地址权重、接线检查与 UCF 约束

从卡诺图到实际接线,中间还差一步:确认地址权重。数据选择器的 A2A1A0 必须和计数器的 Q2Q1Q0 一一对应,A2 接 Q2、A1 接 Q1、A0 接 Q0,顺序错了,序列就整个乱掉。很多人接完发现输出是“1101001”之类看似有规律但不对的码,八成是把 A0 和 A2 接反了——地址位反转相当于把真值表左右镜像,输出当然不对。

验证顺序建议这样:先把计数器单独跑起来,用三个 LED 看它是不是 000 到 110 循环;确认无误后,再把地址线接到选择器,数据端先全部接同一个电平,看输出是不是恒定;最后按表逐位接数据端。分三步走比一次性接完再排查要快得多,因为每一步只有一个变量。

硬件引脚约束在 UCF 文件里写,格式如下。引脚编号必须对照实验箱的引脚分配表填写,下面只是格式示范,直接照抄编号大概率点不亮。

# 时钟输入:按实验箱晶振分配表填写实际引脚 NET "clk" LOC = "P38" | IOSTANDARD = LVCMOS33; # 复位按键,低有效 NET "rst_n" LOC = "P40" | IOSTANDARD = LVCMOS33; # 计数器输出送 LED,便于肉眼数状态 NET "q<0>" LOC = "P45" | IOSTANDARD = LVCMOS33; NET "q<1>" LOC = "P46" | IOSTANDARD = LVCMOS33; NET "q<2>" LOC = "P47" | IOSTANDARD = LVCMOS33; # 序列输出,接示波器探头 NET "seq_out" LOC = "P52" | IOSTANDARD = LVCMOS33; # 时钟周期约束,接高频档时按实际频率修改 NET "clk" TNM_NET = "clk"; TIMESPEC "TS_clk" = PERIOD "clk" 20 ns HIGH 50%;

周期约束这一行在纯原理图实验里经常被忽略,但只要工程里有时序逻辑,综合工具就需要知道时钟频率才能正确布局布线。20ns 对应 50MHz,如果实验箱给的是 1kHz 低速时钟,这个约束是过约束,虽然不影响功能,但会拖长实现时间,按实际频率改一下更干净。UCF 文件要确认已经加入工程,并且出现在 Translate 阶段的输入列表里,否则约束等于没写,引脚全按默认分配,下载后板子毫无反应。

5. 避坑与排查:仿真和实测阶段最容易翻车的五处

5.1 仿真阶段:状态多一个、清零不动作、波形读错

现象一:波形上计数器有 8 个状态,比设计的模 7 多一个。原因基本可以锁定在清零方式的判断上,把同步置数当成异步清零来设计,或者反过来。同步置数时状态 6 会完整存在一个时钟周期,第 7 个沿才回 0;异步清零时状态 6 只闪现一下,稳定状态只有 6 个。解决办法是翻器件手册确认 CLR 和 LOAD 是同步还是异步,同步就检出 110,异步就检出 111,改一根反馈线,重跑仿真。

现象二:输出一直停在 0000,波形是条直线。多半是置数或清零信号极性接反,常年有效。低有效的 LOAD 端被常高或常低拉住,计数器每个时钟都在装同一个数。排查时把反馈信号单独引到一个 LED 或者仿真波形里单独看一根线,确认它只在该动作的那一拍变化,其他时候保持无效电平。

现象三:仿真波形看着对,手绘波形对不上。这是读图问题,不是电路问题。仿真图上时钟沿和状态变化的对齐关系很紧密,手绘时容易把“第 n 个沿之后的状态”画成“第 n 个沿之前”。稳妥的画法是在图上先标出时钟沿的序号,再一格一格填状态,填完回头数一遍总数是不是 7 个。

5.2 下载与实测阶段:引脚、探头与接触不良

现象四:下载成功但板子没反应,LED 全灭。先看 UCF 有没有真正生效。综合报告和实现报告里都有引脚分配列表,翻一眼就能确认;如果列表里是空的,说明约束文件没加进工程,或者路径写错。另一个常见原因是引脚号抄错,把时钟接到了按键的引脚上,时钟源根本没有信号进来。解决办法是对着实验箱的引脚分配表逐条核对,别凭记忆。

现象五:示波器上波形抖动、偶尔丢一个周期。面包板或者实验箱的排线接触不良是头号嫌疑,尤其是数据选择器那一片密集接线,稍微碰一下地址线就接触不上。先用万用表通断档把关键几根线量一遍,再换一根短一点的杜邦线。如果换了线还是抖,看是不是探头地线夹得太长,地环路引入的噪声在低频时钟下也会让边沿变得毛糙,把地线夹短、夹在离信号最近的接地点上,波形会干净很多。

这五条里,第一条和第二条占了这类实验故障的绝大多数。我的习惯是每接完一个模块,先不通电,用万用表把反馈路径量一遍,确认逻辑门的输入输出没有短路、没有悬空,再上电看波形。悬空的 TTL 输入会被当成高电平,这个“玄学”现象坑过太多人,凡是不用的输入端,一律接固定电平,不留空。

6. 验收与答辩:用三套波形自证电路是对的

验收环节真正被看的不是电路接得多漂亮,而是你能不能拿出证据链,证明“我设计的”和“我测到的”是同一件事。我的做法是准备一张自查表,每一项都对应一份可出示的材料,答辩时按表走,不慌。

检查项判据对应证据
模 7 状态数稳定状态恰好 7 个,循环无跳变仿真波形 + 手绘状态图
置零法回绕点0110 之后回到 0000仿真波形局部放大
置最大数法回绕点1001 之后回到 1111仿真波形局部放大
模 5 分频比输出周期 = 输入周期 × 5示波器双通道截图
分频占空比与设计声明一致(1/5 或 2/5)示波器光标测量
序列正确性循环输出 1110010,位序不错仿真波形 + 实测截图
引脚约束实现报告中的引脚列表与分配表一致实现报告截图

答辩时被问到设计思路,不用从头讲一遍原理,直接给三段话:这段电路的模值是多少、反馈条件为什么取这一项、波形上哪一处能证明它确实按这个模值在跑。三句话对应三个证据,评委顺着看下去就明白了。被问到“如果改成模 9 怎么改”,答案是改检出条件、重画状态表,方法不变——这个问题考的是你有没有抓住主线,而不是背没背下来。

有个细节值得提醒:手绘波形最好在仿真之前画,画完再拿仿真去对,对不上就说明理解有偏差,这个偏差比波形本身更有价值。我带的几届学生里,凡是先画后仿的,答辩时对时序关系的描述都明显更清楚;反过来先仿后抄的,一问到“第几个时钟沿发生变化”就开始含糊。

从那以后我每次做这类时序电路,都强制走一遍“先列状态表、再画手绘波形、最后跑仿真对照”的流程,哪怕时间再紧也不跳步。跳过一次,后面排查故障花的时间一定更多。希望这套流程帮到你。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询