首页 / 资讯中心 / 文章详情

数字电路计数分频与序列信号设计:基于CB4CLE的ISE工程复现

数字电路计数分频与序列信号设计:基于CB4CLE的ISE工程复现 ★ FEATURED ARTICLE
简介PDF版电工电子实验报告完整记录了计数与分频电路的设计与仿真过程围绕CB4CLE计数器采用置零法与置最大数法实现M7计数器、设计N5整数分频电路、用数据选择器生成“1110010”序列信号等核心任务展开并配有完整的波形观察与记录适合具备电工电子基础的高校学生或计算机专业初学者学习。压缩包内为单个PDF文件大小7.87MB内容编排紧凑已有258人学习。报告从实验目的、设计过程到实验结果与小结均完整呈现包含状态转移表、反馈逻辑推导、电路原理图、ISE 14.7仿真波形以及手绘波形和示波器实测数据深入分析了数字电路在不同工作模式下的逻辑功能与时序特性并对反馈逻辑准确性和器件功能调用等常见设计要点作了提示可帮助读者快速掌握计数器与分频器的设计要领提升数字电路方案验证和波形分析能力。1. 计数与分频电路实验从CB4CLE计数器到“1110010”序列信号的ISE完整复现数字电路实验里计数器与分频电路是最容易出状况的一类设计尤其当你要在ISE 14.7里同时完成M7计数器、N5整数分频和“1110010”序列信号时反馈函数写错一个波形就全乱。这份电工电子实验报告记录的是用CB4CLE计数器配合置零法、置最大数法设计M7计数器再做N5分频最后用八选一数据选择器产生指定序列的完整过程。它不是单纯贴图而是把状态转移表、反馈函数、UCF约束和仿真波形串在一起。适合刚上完电工电子基础、需要交实验报告或想自己搭一遍数字电路的同学。照着做一遍计数器的逻辑功能和时序特性就有了具体画面。2. 用CB4CLE设计M7计数器置零法与置最大数法的反馈逻辑差异2.1 CB4CLE计数器是什么管脚与工作模式CB4CLE是ISE的Core Generator里可以直接调用的4位二进制计数器名字里的CB代表二进制计数4代表位宽CLE通常指Clock Enable。实际使用中不需要手写完整的进位逻辑只要配置好计数器的复位方式、使能方式然后把控制端引出来接反馈逻辑即可。对一个4位计数器来说原始模长是16要变成M7核心工作变成两件事确定在什么状态产生反馈以及把计数器拉回哪个起点。常见的管脚包括时钟CLK、计数使能CE、置数控制端L、数据输入端D[3:0]以及输出端Q[3:0]。生成IP时一般可以选异步清零还是同步清零这个选择会直接影响反馈函数取状态6还是状态7。实验报告没有刻意区分这一点但用ISE复现时一定会碰到所以先记住结论凡是“生成后直接接反馈”的控制端都要先确认它是同步还是异步否则波形会差一个周期。另一个容易忽略的是使能端CE。很多从网络复制来的电路图里CE直接接高电平但如果你的原理图存在竞争冒险CE悬空或接到了别的信号计数节奏就会被打乱。我一般会把CE固定接1把复位和置数单独拿出来处理这样反馈逻辑的关系更清晰。CB4CLE的输出是4位但M7只需要用到一部分状态剩下的状态在仿真里不会出现所以不用担心。2.2 置零法设计M7状态转移表与反馈函数推导置零法的思路很直接置数端D[3:0]全部接0当计数器进入某个状态后反馈逻辑给出一个清零信号让计数器回到0。因为是4位计数器状态从0000开始经过0001、0010、0011、0100、0101、0110然后回到0000。如果采用同步清零反馈条件取状态0111也就是十进制7等q变成0111后下一个时钟沿把0000写入。此时有效状态是0到6模长正好7。反馈函数写起来非常简单L Q2 Q1 Q0为什么Q3不参与因为0到7这个区间里Q3始终为0而0100到0110这几个状态虽然Q21但Q1和Q0不会同时为1。只要同时出现Q21、Q11、Q01这个组合一定是0111所以用三输入与门就够了。这种化简方法在数字电路实验里经常出现本质就是“在一个有限状态集合里找唯一判定条件”。下面是一段行为级参考代码用于理解置零法的时序// 置零法 M7 计数器参考同步清零 module counter_m7_clear( input wire clk, input wire rst_n, output reg [3:0] q ); wire clear; // 反馈函数q 0111 时产生清零脉冲 assign clear (q 4b0111); always (posedge clk or negedge rst_n) begin if (!rst_n) q 4b0000; // 复位到0 else if (clear) q 4b0000; // 置零法回到0 else q q 1b1; // 正常加计数 end endmodule代码里clear就是与门输出的等价描述。注意这个参考写的是同步清零q0111出现后要等到下一个时钟上升沿才把0写进去所以仿真时会在0111上看到一个窄脉冲。如果你生成的CB4CLE是异步清零清零响应会更快但组合逻辑的竞争冒险也更明显。参数上唯一要改的是反馈条件换一种模数就换对应的二进制状态。置零法的一个不足是如果采用异步清零反馈信号直接作为清零端组合逻辑在q0111的瞬间产生脉冲各路输出引脚延迟不同可能造成清零后的状态不是0000而是某个随机值。这个坑在实验箱上出现概率不低所以不少做法宁可把反馈条件提前到0110也不愿意用异步清零去赌器件内部延迟。2.3 置最大数法设计M7预置数与反馈条件的配合置最大数法不是从0开始计而是让计数器从“16-M”这个预置数开始一直计到最大数15然后靠最大数反馈置回起点。对M716-M9也就是D[3:0]接1001状态序列为9、10、11、12、13、14、15同样7个状态。反馈条件直接取最大值15反馈函数是L Q3 Q2 Q1 Q0这个式子工程上很讨巧因为4位计数器到达最大值1111时进位输出CO本身就会变高不需要额外画与门直接把CO反相后接到置数端即可。用置最大数法的好处是反馈条件发生在计数器的自然终点不存在“提前编译码”那种毛刺窗口波形稳定性比置零法好。参考代码// 置最大数法 M7 计数器参考预置9状态9~15 module counter_m7_loadmax( input wire clk, input wire rst_n, output reg [3:0] q ); wire load; // 反馈函数到达最大数15时产生置数脉冲 assign load (q 4b1111); always (posedge clk or negedge rst_n) begin if (!rst_n) q 4b1001; // 预置9 else if (load) q 4b1001; // 回到9 else q q 1b1; end endmodule这里的load等价于LQ3Q2Q1Q0。注意预置数是四位的1001也就是十进制的9。如果把D接成0110状态会变成6到15共10个状态模长就不是7了。血泪经验每次改D值之前先按十进制把16-M算一遍再转换成二进制填到原理图的D0到D3上能少走很多弯路。2.4 置零法和置最大数法的选型边界比较项置零法预置0置最大数法预置16-M起点状态09对M7反馈条件715反馈函数Q2 Q1 Q0Q3 Q2 Q1 Q0毛刺风险相对高相对低级联扩展需要额外译码可用自然进位输出选型时如果只是单独做一个模7计数器置零法更直观状态转移表和波形都从0开始好交实验报告。如果是做分频链或需要接下一级计数器优先用置最大数法因为进位输出CO可以直接级联不需要外部与门再判一次状态。实验报告把两种方法都做了一遍目的就是让你把这两条路都走通后面设计任意模数计数器时能按场景选。3. N5整数分频电路模5设计与反馈逻辑LQ2的推导3.1 分频比N5的本质周期拉长5倍分频电路的任务是让输出信号周期变成输入时钟周期的N倍。对N5输出周期Tout 5 × Tclk。做法是用计数器对输入时钟的上升沿计数每计满5个脉冲产生一个反馈信号。这里设计模5计数器状态从0到4。需要强调分频比不等于占空比实验报告的反馈函数LQ2这个信号在状态4时变高清零后回低所以输出是一个周期为5T、高电平只有一个时钟周期宽的窄脉冲。如果后面接的电路对高电平宽度有要求就要再对L做一次二分频。很多人第一次做分频会把“分频比”和“输出高电平时间”混在一起理解。其实分频电路只要保证频率关系正确就行占空比可以用后级电路再整形。实验箱上用示波器观察时首先应该数周期而不是看高电平宽度。频率计能直接读出f/5但示波器要手动数波形把时基拉开确保看到至少5个输入时钟脉宽。3.2 状态转移表与反馈函数LQ2模5计数器的状态转移表比较简单Q2Q1Q0从000到100。反馈条件最省门电路的取法是当计数到100也就是十进制4时直接取Q2作为反馈信号。为什么不用状态5译码因为模5计数器的状态范围只走到4101并不在状态表中。Q21同时出现在状态4和状态5但既然状态5不会出现直接用Q2就不会误触发。这样反馈函数就简化成一根线不需要任何与门。但要注意同步清零和异步清零的区别。如果计数器是同步清零Q21在状态4会保持一个完整时钟周期下一个上升沿清零如果异步清零状态4只是一个极短脉冲。两种情况下输出频率都是输入的五分之一但波形形状完全不同。实验报告同时给出仿真波形和示波器波形就是为了让你看到这个差异。参考代码// N5 整数分频电路参考模5计数器反馈LQ2 module freq_div_5( input wire clk, input wire rst_n, output reg [2:0] q, output wire fout ); always (posedge clk or negedge rst_n) begin if (!rst_n) q 3b000; else if (q 3b100) // 计数到4 q 3b000; // 清零 else q q 1b1; end assign fout q[2]; // 反馈函数 LQ2同时作为分频输出 endmodule代码里q是3位模5只需要3位。fout直接取q[2]当计数器到4时输出高清零后变低。如果想得到50%占空比把fout再接一个T触发器但那样输出频率会再除2。所以设计前必须想清楚你最终要的信号是从清零端取还是要从某个计数输出位取。实验里用q[2]直接输出正好对应LQ2。3.3 ISE 14.7下的UCF约束与仿真实现ISE 14.7里搭这个电路有两种做法一种是在Schematic里放CB4CLE和必要的门电路另一种是写HDL代码。实验报告采用原理图方式但UCF约束是共通的。UCF文件用来把设计里的网络名映射到实验箱的物理引脚并指定电平标准。下面是一个占位示例。NET clk LOC A10 | IOSTANDARD LVCMOS33; NET rst_n LOC B4 | IOSTANDARD LVCMOS33; NET q[0] LOC C3 | IOSTANDARD LVCMOS33; NET q[1] LOC D4 | IOSTANDARD LVCMOS33; NET q[2] LOC E5 | IOSTANDARD LVCMOS33; NET fout LOC F6 | IOSTANDARD LVCMOS33;引脚编号是我按常见实验箱给的占位值拿到板子以后必须按实验箱手册或开发板原理图改。UCF只约束引脚和电平标准不描述功能功能由原理图或HDL决定。在ISE 14.7里加入UCF文件后不要忘记在Process窗口运行Constraints Check否则有些拼写错误要到Implement阶段才暴露。仿真时建议在testbench里给一个10ns的时钟周期复位低电平保持30ns再释放。这样波形一开始就能看到q从000起步而不是停在未知状态。示波器实测时输入时钟用实验箱上的信号源输出端fout接到通道2触发源选输入时钟通道时基调到能看到5个输入脉冲再切换。对照仿真波形时只要数清楚5个输入时钟沿对应1个输出脉冲分频设计就算验证通过。4. 数据选择器产生“1110010”卡诺图降维与数据端设置4.1 序列信号与模7计数器的配合产生“1110010”本质上是做一个周期为7位的串行序列发生器。常见结构是模7计数器提供地址000到110接八选一数据选择器的地址端数据选择器的8个数据输入端D0到D7按序列值接高电平或低电平。计数器循环一圈选择器输出端就依次得到1、1、1、0、0、1、0。这种结构的核心是“计数器定节奏选择器定内容”。如果序列长度不是2的幂比如这里长度是7那么只接需要的D0到D6D7可以接地或悬空。但为了避免仿真时出现高阻态我一般会把D7接地。地址111在正常工作时不会出现但如果计数器上电瞬间进入了非法状态D7接地能让输出保持固定电平。这里要注意序列的位顺序必须和地址顺序严格对应。“1110010”这个写法默认从第一个时钟开始输出第一个1然后是第二个1、第三个1、接着两个0、一个1、一个0。如果你把顺序搞反仿真时看到的就是“0100111”排错时会浪费很多时间。4.2 从卡诺图到数据端真值表实验报告里提到“画出卡诺图后降维”。对于8选1数据选择器卡诺图降维的直观理解是把8种地址组合对应的输出值直接填到数据端。地址000对应D01001对应D11010对应D21011对应D30100对应D40101对应D51110对应D60。用公式表示就是地址CBA输出F00010011010101101000101111001110不出现如果手算卡诺图可以从输出F的卡诺图反推每项但用数据选择器实现时不需要化简直接“降维”到数据端即可数据端接固定的VCC或GND地址端由计数器驱动。这也是数据选择器比用与或门搭序列发生器更灵活的地方改序列只需要改D端的接线不用动计数器。卡诺图降维在这里的另一个作用是帮助你发现能不能进一步省器件。比如如果序列里有连续的相同值可以把某些数据端接在一起。但因为模7计数器本身已经存在省下来的门电路可能反而增加连线的复杂度。实验阶段我建议先按“一对一”的方式接功能跑通后再考虑化简。4.3 用代码与原理图搭出序列如果不用原理图里的CB4CLE也可以用HDL直接写出完整设计。下面这段参考代码把模7计数器和八选一逻辑写在了一起便于理解整个输出过程。// 模7计数器 八选一逻辑 产生 1110010 序列 module seq_gen( input wire clk, input wire rst_n, output reg seq ); reg [2:0] cnt; // 模7计数器状态0~6 always (posedge clk or negedge rst_n) begin if (!rst_n) cnt 3b000; else if (cnt 3b110) // 计数到6 cnt 3b000; // 回到0 else cnt cnt 1b1; end // 数据端真值表D0~D6 对应 1110010 always (*) begin case (cnt) 3b000: seq 1b1; 3b001: seq 1b1; 3b010: seq 1b1; 3b011: seq 1b0; 3b100: seq 1b0; 3b101: seq 1b1; 3b110: seq 1b0; default: seq 1b0; endcase end endmodule代码里的case语句等价于八选一数据选择器。如果画原理图就是把cnt[2]、cnt[1]、cnt[0]接到选择器的地址端D0到D6分别接VCC或GNDD7接地。改序列时只需要改case分支或D端接线计数器完全不用动。参数上最大计数状态是110也就是6所以每7个时钟输出一组七位序列。这种序列信号发生器在通信协议里很常见比如生成帧头同步码。实验报告要求你用示波器观察本质上就是验证“地址和目标输出是否严格同步”。如果在示波器上看到前三个1连续出现接着两个0再接1和0就说明计数器和数据选择器的配合没问题。5. 常见问题与避坑反馈逻辑、置数端、波形观察的五个坑5.1 反馈条件写错计数器变成了模8或模15现象仿真波形里计数器没有在预期状态归零M7变成了M8或者干脆模16。原因置零法反馈条件取了0111但CB4CLE配置成了异步清零反馈组合逻辑的译码时机不对或者置数端D根本没接对反馈信号没有真正送到控制端。解决先把仿真波形放大数一下每个状态持续几个时钟周期。如果是模8检查反馈函数是否在时钟沿之后才生效如果是模16说明反馈信号压根没接到清零端。我一般会在testbench里把复位释放时间延迟几个时钟让q的初始值可见然后用$display打印反馈脉冲出现的时刻逐周期核对。5.2 置数端D值接错置最大数法跑飞现象置最大数法仿真时输出状态范围不对比如M7却看到9到16或者0到6。原因D[3:0]接的预置数不是16-M可能把9接成了10或者把D0到D3的顺序搞反。很多原理图里D3是最高位接线时容易把位序弄乱。解决先把9转换成二进制1001再对照原理图引脚D3到D0。反馈条件也要确认是15也就是1111别用成6。每次改动后先跑一次仿真看第一个状态是不是9如果第一个状态是其他值说明预置数或复位逻辑还没对上。5.3 ISE仿真输出全是高阻现象仿真波形里q、seq和fout一直显示为Z或X看不到计数翻转。原因测试激励里没给复位或者CE使能端悬空或者输出引脚在原理图中没有真正连接。解决先写一个包含复位释放的testbench。时钟周期设为10ns复位在10ns内拉低20ns后拉高。检查CE端是否固定接1尤其是从原理图生成网表时悬空的输入在仿真里会变成高阻。还要检查UCF里是否把输出约束到了特殊引脚在ISE里跑Behavioral Simulation时UCF管脚约束一般不影响功能仿真但会改变顶层端口的可见性。5.4 示波器实测有毛刺现象示波器上看到输出在上升沿或下降沿附近有多个窄脉冲计数器偶尔跳到错误状态。原因异步清零信号经过与门产生了竞争冒险清零脉冲出现了一高一低的抖动。置零法里反馈函数LQ2Q1Q0在状态0111瞬间拉高如果各路信号到达与门的延迟不一致输出会产生毛刺。解决优先改用同步清零或同步置数法如果只能在原理图上改在反馈与门后面加一个D触发器打一拍再送到清零端。实验箱上用示波器观察时探头地线夹尽量靠近芯片地也能减少外部噪声的耦合。波形毛刺不一定代表设计逻辑错但会干扰计数器的状态所以不能忽略。5.5 分频输出占空比理解错现象N5分频电路输出频率看起来对但高电平时间很短或者用频率计测出来是f/10而不是f/5。原因把LQ2直接当作分频输出这是对的但如果你为了让波形更好看又把输出接到一个二分频器上等于多除了一次2频率就变成了f/10。解决先想清楚你要的是“分频比”还是“占空比”。实验报告里的N5只要求周期输出是窄脉冲是可接受的。如果需要50%占空比就把模5输出再接一个T触发器但最终频率是f/10还是f/5取决于你从哪个信号点取样。用示波器看周期最直接数5个输入时钟对应1个输出脉冲这个关系对了分频设计就对了。6. 用仿真波形反向验证设计把时序图当调试工具6.1 核对反馈脉冲出现的时刻把仿真波形放大先找到反馈信号或清零信号变高的位置。对置零法M7反馈脉冲应该出现在q0111期间对置最大数法脉冲应该出现在q1111期间。你可以把这个脉冲位置和状态转移表逐行对照确认反馈条件没有提前或延后。如果反馈脉冲宽度只有一个时钟周期说明设计是同步逻辑如果脉冲极窄要留意是不是异步清零的毛刺。6.2 手绘波形与仿真波形的对照方法实验报告要求手绘波形其实是一个很好的预判工具。动手画之前先列出状态表再画出每个状态的时钟沿。画完再和ISE仿真波形对照重点看q的跳变沿是否都落在时钟上升沿。手绘波形和仿真波形相差一个周期是常见的事主要原因是对“清零在哪个沿生效”理解不一致。我习惯在纸上标注“当前沿之前的状态”和“当前沿之后的状态”这样对照时不会数错。6.3 示波器触发设置技巧上实验箱时把输入时钟接到示波器通道1输出信号接通道2触发源选通道1。时基先调到能看到5到10个时钟周期的宽度然后慢慢加密。不要用通道2做触发源因为分频输出的窄脉冲有时不够稳定。如果输出信号太窄看不清可以把通道2的耦合改成直流时间轴保持和输入时钟一致。从那以后我每次做计数器或分频设计都会先画出状态转移表和手绘时序图再打开ISE写代码或画原理图。仿真波形出来后我会强制走一遍“反馈脉冲出现时刻核对、预置数值核对、输出周期计数”这三步确认无误再上实验箱。这套习惯帮我躲过了很多次看起来像“玄学”的跳变问题。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站