VHDL教程-第2部分-Testbench
快速链接
- 第1部分: VHDL教程
- 第2部分: 第2部分-测试平台
- 第3部分: 结合时钟和顺序逻辑
- 第4部分: 创建分层设计
- 第5部分: 一个实际的例子-第1部分-硬件
- 第6部分: 实际示例-第2部分-VHDL编码
- 第7部分: 一个实际示例-第3部分-VHDL测试平台
在一个 较早的文章 我介绍了一个简单设计的VHDL编码。在本文中,我将继续该过程,并创建一个测试平台模块来测试早期的设计。 Xilinx ISE环境使启动测试过程变得非常容易。要开始此过程,请从“项目”下的菜单项中选择“新源”。这将启动“新源向导”。在向导中,选择“ VHDL测试台”,然后输入新模块的名称(单击“下一步”继续)。然后,“新源向导”允许您选择要与新源关联的源(在本例中为上一篇文章的ClkDiv),然后单击“下一步”。然后,向导将为测试平台模块创建必要的样板(请参见下文)。
样板包括组件声明部分(第38-58行)和测试实例化(第62-70行)。样板还包括用于主要测试过程的存根(tb:PROCESS,第72-81行)。我们的工作是将这个简单的存根转换为实际的测试序列,以执行我们的设计。
设计测试平台的第一步是为主时钟(MCLK)创建一个连续的时钟信号。 VHDL提供了一种创建重复信号的简单方法。这在以下代码片段中完成。
第一条语句(第60行)定义了一个常数,该常数等于主时钟周期的一半。其余的行(74-48)创建一个切换主时钟(MCLK)的过程。在第一个12.5ns之后,MCLK被驱动为低电平,在随后的12.5ns之后,MCLK被驱动为高电平。该过程总共等待25ns,然后重复。此步骤序列产生40MHz的主时钟信号。
下一步是建立设备的初始条件并生成复位脉冲。以下语句显示了此顺序。
在上图中,第80-81行打开了测试平台过程(tb)。第一个延迟(线84,等待100 ns)允许CPLD中的上电复位动作完成。根据该语句,我们为设备建立了初始条件(第86行,注意:SeqReset为驱动器低电平)。 100ns(第87行)后,将设备从复位状态(第89行)移开并运行。默认时钟速率有效,可以通过暂停测试平台过程并允许设备运行来观察(第90行,等待1μs)。
现在可能是查看某些数据的好时机。模拟以上语句,我们可以检查数据是否开始像我们期望的那样看起来。
查看数据,从时间零开始,我们可以看到MCLK在SeqReset保持低电平的情况下进行了切换。在第一个主要时序标记(200ns)处,我们可以看到SeqReset被驱动为高电平,而adc_clk很快开始切换(半周期为500ns,或预期的1MHz速率)。到现在为止还挺好。
该过程的下一步是写入时钟除数(RegSel ='01',InByte =速率选择,RegStrb ='0',然后RegStrb ='1')。经过必要的延迟后(对于RegStrb并允许时钟除数运行),我们可以为每个时钟速率重复该序列。以下代码片段显示了这些序列。
对于每个目标时钟速率,我们需要重复设置时钟选择寄存器(Inbyte)和寄存器选择(RegSel)值以及切换RegStrb行(即第92-94行)的基本顺序。我们还需要留出时间观察选定的时钟速率(即第95行)。然后针对每个时钟速率重复这些语句(记住要增加每个新时钟速率的“观察”等待时间)
现在我们可以看看完成的结果。
在每个时钟选择点(切换RegStrb),我们都会看到输出时钟速率(Adc_Clk)发生变化。我测试了这段代码是一件好事。在生成该测试平台的过程中,我发现我在较早的VHDL代码中犯了一个错误(剪切和粘贴,但第48行和第50行的数据没有更改)。在上一篇文章中,ClkDiv流程编写为:
在测试中,我发现需要将ClkDiv流程更正为:
它只是表明,如果您没有测试过,它可能就无法工作。
在以后的文章中,我将展示VHDL的一些更高级的编程技术。
再次,祝您设计愉快!
基因
吉恩·布雷尼曼(Gene Breniman)先前的文章:
VHDL教程
吉恩·布雷尼曼(Gene Breniman)的下一篇文章:
我生命中的伟人。