赞
踩
SoC设计中,有时需要产生微秒、毫秒或者秒脉冲。同样,一个复杂电路中,很多不同的内部电路中也需要产生这类定时脉冲。比较好的方法是设计一个定时器电路,它产生不同类型的定时脉冲,供所有其他电路使用以降低逻辑资源消耗。定时器电路可以产生us_tick(微秒标记),ms_tick(毫秒标记)和sec_tick(秒标记),供整个系统使用,如图6.36所示。假设输入时钟频率为200MHz,每个时钟周期长为5ns,那么产生微秒标记就需要计数器进行从0到199的循环计数。此后,我们就可以利用us_tick和一个在0到999之间进行循环计数的计数器来产生ms_tick以此类推,可以产生ms_tick和sec_tick。
定时器电路的代码及仿真结果如下。
- module timetick_gen(clk_100,reset,us_tick,ms_tick,sec_tick);
- input clk_100,reset;
- output us_tick,ms_tick,sec_tick;
-
- reg [7:0] us_counter;
- wire [7:0] us_counter_nxt;
- reg us_tick;
- wire us_tick_nxt;
-
- reg [9:0] ms_counter,ms_counter_nxt;
- reg ms_tick;
- wire ms_tick_nxt;
-
- reg [9:0] sec_counter;
- wire[9:0] sec_counter_nxt;
- reg sec_tick;
- wire sec_tick_nxt;
-
- assign us_counter_nxt = (us_counter == 'd99)?'d0:(us_counter + 1'b1);
- assign us_tick_nxt = (us_counter == 'd99);
- always@(*)begin
- ms_counter_nxt = ms_counter;
- if(us_tick)begin
- if(ms_counter == 'd999) ms_counter_nxt = 'd0;
- else ms_counter_nxt = ms_counter_nxt + 1;
- end
- end
-
- assign ms_tick_nxt = (ms_counter == 'd999);
- assign sec_counter_nxt = ms_tick?((sec_counter == 'd999)?'d0:(sec_counter + 1)):sec_counter;
- assign sec_tick_nxt = (sec_counter == 'd999);
-
- always@(posedge clk_100 or negedge reset)begin
- if(!reset)begin
- us_counter <= 'd0;
- ms_counter <= 'd0;
- sec_counter <= 'd0;
- us_tick <= 'd0;
- ms_tick <= 'd0;
- sec_tick <= 'd0;
- end
- else begin
- us_counter <= us_counter_nxt;
- ms_counter <= ms_counter_nxt;
- sec_counter <= sec_counter_nxt;
- us_tick <= us_tick_nxt;
- ms_tick <= ms_tick_nxt;
- sec_tick <= sec_tick_nxt;
- end
- end
-
- endmodule
测试代码如下:
- `timescale 1ns/1ns
- module testbench;
- reg clk_100_tb;
- reg reset_tb;
- wire us_tick_tb,ms_tick_tb,sec_tick_tb;
- parameter CLK_HALF_PERIOD = 5;
- initial begin
- clk_100_tb = 0;
- forever #CLK_HALF_PERIOD clk_100_tb = ~clk_100_tb;
- end
- initial begin
- reset_tb = 0;
- #100 reset_tb = 1'b1;
- end
- timetick_gen timetick_gen_test
- (.clk_100(clk_100_tb),
- .reset(reset_tb),
- .us_tick(us_tick_tb),
- .ms_tick(ms_tick_tb),
- .sec_tick(sec_tick_tb));
-
- endmodule
仿真结果如下:
有时,我们需要根据特定的输入波形产生所需的输出波形,例如,将下降沿延长几个时钟周期、去掉几个上升沿等。接下来我们将讨论一些通用的例子,理解波形整形的基本概念和方法,并推广到其他类似的应用之中。其基本思路是将一个输入波形的上升沿和下降沿通过触发器进行延迟,延迟后的波形与原始波形通过组合逻辑电路处理后得到所需的波形。
在下面的例子中,输人信号为A,我们希望产生上升沿被延迟两个时钟周期、下降沿被延迟一个时钟周期的输出信号为B,如图6.37所示。
输入信号A通过两个触发器进行移位寄存,产生A_del1和A_del2。使用下面的组合逻辑产生最终输出的信号B:B=A_del2 & A_del1, 如下图所示:
NOW现在行动!
学习Xilinx FPGA最好的资料其实就是官方手册,下表总结了部分手册的主要介绍内容,关注我,持续更新中......
文件名 | 主标题 | 内容简单介绍 | 是否有中文版 | |
UG476 | 7 Series FPGAs GTX/GTH Transceivers | GTX和GTH介绍,PCIe、serdes等学习必备 | 否 | |
UG471 | 7 Series FPGAs SelectIO Resources | 描述 7 系列 FPGA 中可用的 SelectIO资源。 | 否 | |
UG1114 | PetaLinux Tools Documentaton | PetaLinux 工具文档 参考指南 | 是,V2019.2 | |
UG949 | UltraFAST 设计方法指南(适用于 Vivado Design Suite) | 赛灵思® UltraFast™ 设计方法是用于为当今器件优化设计进程的一套最佳实践。这些设计的规模与复杂性需要执行特定的步骤与设计任务,从而确保设计每一个阶段的成功开展。依照这些步骤,并遵循最佳实践,将帮助您以最快的速度和最高的效率实现期望的设计目标 | 是,V2018.1 | |
IP手册 | pg057 | FIFO Generator | FIFO生成器IP使用手册 | 否 |
pg104 | Complex Multiplier | 复数乘法器IP使用手册 | 否 | |
pg122 | RAM-Based Shift Register | 移位寄存器IP使用手册 | 否 |
推荐阅读
【Vivado那些事】Vivado中常用的快捷键(二)其他常用快捷键
图书推荐|ARM Cortex-M0 全可编程SoC原理及实现
1202年了,还在使用虚拟机吗?Win10安装Ubuntu子系统及图形化界面详细教程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。