当前位置:首页 >> 信息与通信 >>

FPGA


第7章

FPGA DSP 嵌入式系统设计
§7.1 设计流程概述

DSP(Digital Signal Processing)技术在通信、图像处理增强、数据获取、雷达及 视频处理等等领域有着广泛的应用,因此,DSP 的使用也不只存在唯一的方法,而是要根 据不同的目的提出不同的解决方案。可编程芯片的 FPGA 逐渐成为这些解决方

案中的一个 重要的组成部分。预计用于 DSP 的可编程芯片的产量将以平均每年 41.6%的比率增长,到 2005 年,产量已达到 17.8 亿美元。 通常,DSP 算法的实现有两种途径:低速的用于普通目的的可编程 DSP 芯片;高速 的用于特定目的的固定功能 DSP 芯片组和 ASIC(Application Specific Integrated Circuit)芯 片。而 FPGA 是 DSP 设计人员的另一种选择。大多数 FPGA 是由逻辑单元阵列、各个逻辑 单元之间的可编程互连线、I/O 管腿和其他一些如片上的存储器之类的资源组成的。其中逻 辑单元是由 1 个四输入的查找表和 1 个触发器构成的。 与普通的 DSP 芯片相比,FPGA 芯片能够更好地实现并行处理,从而提高了性能并节 省了能源。如算法中使用了 14 个 MAC(Multiply & Accumulate) ,与只有 1 到 4 个 MAC 的 通用 DSP 芯片不同,在 FPGA 中可以配置 14 个乘法器,以实现并发处理。而这种流水线结 构的数据流可以使信号负载最小化,从而节省指令和数据存取的系统开销。此外,因为芯 片所消耗的能量与它的时钟频率成正比,FPGA 可以将输入的数据流分离开, 并将它们作为 几个并行的数据流进行处理,从而工作在一个较低的时钟频率下,这样做也就节省了能源。 相对来讲,FPGA 设计的灵活性和适应性更强。而与 ASIC 芯片相比,FPGA 可以反复使用, 并且在产品制成后还能重新更改设计。这样做有三点好处:修补 bug;加入新的功能;使系 统适应新的标准。使用 FPGA 的现场可编程能力,不但避免了高额的开发费用,而且满足 产品的上市需求。 虽然有如此多的优点,但是目前 FPGA 在 DSP 应用上所占用的份额并不大,而且主 要是用做协处理器,以辅助 DSP 芯片完成一些计算密集型的算法。这种现象的造成主要有 两方面的原因。一方面,在软件上,DSP 与 FPGA 之间有着巨大的隔阂。生活在软件世界 的 DSP 程序员要学习如寄存器、门、VHDL 代码等等新的知识才能进入电子工程的世界。 这两类设计人员不但完成设计时所使用的工具不一样,而且,在设计中所考虑的问题也不 同。表 1 表示了他们之间的差异。另一方面,在硬件上,原先的 FPGA 芯片没有集成专门 的乘法器,只能依靠用户自己编辑乘法器。乘法器的实现比较耗费以查找表为主的系统资 源,所以在编辑完并行的 MAC 后,FPGA 所剩的资源无几,从而限制了 FPGA 的使用。正 是由于这两个主要的因素,使 FPGA 无法在 DSP 领域中有更大的作为。
表 7-1 DSP 设计者 设计方法 C,C++,汇编 MATLAB,SimuLink 设计问题 信噪比,误码率,采样率 FPGA 设计者 VHDL/Verilog 编程 综合,映射,布局布线 腿到腿延时,流水线和逻辑层次,布局规划

横亘在软件间的隔阂和硬件结构上的差异限制了 FPGA 的 DSP 应用,但是现在这项 工作变得简单了, Xilinx 公司提出了一整套的解决方案。 不但出现了 IP (Intellectual Property) 核(Core)形式的 DSP 算法和将这些 IP 核集成到 FPGA 设计的工具软件,而且出现了新的

1

FPGA 芯片。软件上一个重要的代表是 XtremeDSP 系列软件包,主要包括: MathWorks 公司的 Matlab 和 Xilinx 公司的 System Generator 负责系统级设计; Mentor Graphics 公司的 FPGA Advantage 或 Synplicity 公司的 Synplify Pro 做 HDL 综合; Model Technology 公司的 ModelSim 负责仿真; Xilinx 公司的 Foundation Series ISE 负责硬件实现。 图 7-1 表示使用 Xtreme 设计 DSP 算法的流程。在硬件方面,Xilinx 公司推出最新的 Virtex II 系列 FPGA 芯片。它内置了 192 个 18×18 bit 的高性能组合乘法器,支持高达 250MHz 的数据率,内部固化了并行的 DSP 数据模型。它的密度达到一千万系统门,可以 运行 600G MAC/s。大大超出了当今通用 DSP 芯片的性能(TI 的高端 DSP 芯片 TMS320C6000 的定点系列 C64x 只能达到 1.6—2.4G MAC/s) 设计方法和硬件结构上的改 。 进使 FPGA 在 DSP 上的应用前景变得光明起来。

图 7-1

Xtreme 系统中实现 DSP 的设计流程图

Xilinx 公司同它的合作者联合提出了 XtremeDSP 解决方案, 它在系统结构设计和基于 FPGA 的 DSP 系统硬件实现之间建立起一座桥梁。 System Generator 同 Simulink 模型工具结 合,可以参数化、最优化算法。它可以自动从行为级的系统模型转换到 FPGA 实现,其间 不再需要手工重设,大大节省了开发时间并降低了出错概率。通过软件,用户可以在 DSP 函数的算法、性能、节能、硅片面积中进行选取,可以快速地分析出它的运算速度和花费。

2

图 7-2

基于模型的设计过程

Xilinx FPGA 支持用户在同一个设计的不同部分创建自定义的字长。Xtreme 支持不同 的比特数、流水线程度和实现的选择方法。对于某些需要更多比特数来表示精度的通道, 只要更改 IP 的参数,软件就会自动适应新的数据配置。 Xtreme 的配置灵活, 用户可以根据需要进行设置: 若全部使用并行结构就可以达到最 大的数据吞吐量,也可以由于降低了系统时钟而节省能源;相反的,若全部使用串行结构 则会使硅面积最小,节省花费,但同时仍能够得到相当的性能。 MATLAB 作为线性系统的一种分析和仿真工具,在工程和计算科学上有着广泛的应 用。它建立在向量、数组和矩阵的基础上,结合了可视化的数学计算和强大的技术语言。 内建的接口可以从指令、文件、外部数据库和程序中迅速得到数据。Simulink 作为 Matlab 的一个工具箱(toolbox) ,在整个的 DSP 设计中起着举足轻重的作用。它是一个交互式的工 具,用于对复杂的系统进行建模、仿真和分析。成为控制系统设计、DSP 设计、通信系统 设计和其它仿真应用的首选工具。它的特性为:建立图形式的模块列表,模拟复杂系统, 评估系统的性能,提高设计水平;建立模拟、数字或数模混合的信号系统,控制逻辑器件; 与 Matlab 的结合;与 Stateflow 紧密结合,建立数据驱动行为的模型;广泛利用 DSP 库。 System Generator 是 Xilinx 公司的的一个模块集 (blockset)它是 simulink 的一个插件, , 其中设置了 Xilinx 特有的 DSP 功能的 IP 核, 包括了基本 DSP 函数和逻辑算符, FIR 如 (Finite Impulse Response) 、FFT(Fast Fourier Transform) 、存储器、数学函数、转换器、延时线等 等。这些预先定义好的模块保证了 FPGA 实现时的位-bit 和周期-cycle 的正确。使用它可以 自动生成 VHDL/Verilog 语言、测试向量以及可以使 ModelSim 仿真的“.do”文件。为了得 到最佳的性能、密度和可预测性,System Generator 还会自动将特定的设计模块映射成高度 优化了的 IP 核模型。Xilinx Blockset 中的模块,有的可以直接映射到硬件,有的对应着 IP 核。它们中每个都可以根据设计要求更改参数,支持双精度和定点的算法。这个模块集是 一个可以外部扩展的库, 使用的是 C++的定点算法, 所以用户可以创建自己的基于 C++ 类的 Simulink 库元件,在设计中它会被当作黑箱(Blackbox)处理。 有两种可以实现 HDL 综合的工具:Mentor Graphics 的 FPGA Advantage 和 Synplicity 的 Synplify。这两个工具都可以将上一步(使用 Simulink 和 Xilinx System Generator 完成的

3

设计) 的顶层 (和附加的子 VHDL 文件) HDL 行为级或 RTL 设计文件转化成门级表示 (EDIF 文件) 。可以使用其中的任意一个软件来完成这个任务。这些工具可以:将 HDL 综合成门 级的设计实现;通过消除对每个门的定义,减少了设计时间;减少了手工将硬件说明翻译 为原理图设计中可能出现的错误数量;在最优化原始的 HDL 代码过程中应用了综合工具的 自动技术(如机械编码类型、自动 I/O 插入) ,从而使设计更有效率。 使用 ModelSim 就可以在设计过程中对 HDL 进行仿真, 以保证结果的正确性。 它的特 性如下:通过使用 Direct Compile 结构,达到最快的编辑速度和有竞争力的模拟性能;使用 Single Kernel Simulation,将 VHDL 和 Verilog 结合在一起;将 machine 和 Simulator 版本独 立开来,以简化可携带性和库的维护。 Xilinx 的 ISE 软件包含了最新的实现工具,可以用来创建有效简洁的设计。当综合完 VHDL 文件后,就会得到顶层的 EDIF 文件(也有子层的 EDIF 文件) ,将这些 EDIF 文件作 为 Xilinx Design Manager 的输入源进行实现,它将翻译(Translate) 、映射(Map) 、布局布 线(Place & Route)以及配置(Configure)该设计。最终得到下载用的位流文件。它的时序 驱动的布局布线特性允许用户为特定的路径指定自己的时序;静态时序分析能够减少设计 步骤;能够在实现前后对设计进行验证;可以重新迭代先前的设计以缩短整个设计周期。 利用 FPGA 实现 DSP 嵌入式系统,已有互相补充的软件设计工具,表 7-2 列出了在系 统建模和设计、算法开发和优化、HDL 仿真和产生及设计校验和诊断等不同设计阶段使用 的软件。
表 7-2 设计阶段 系统建模 和设计 FPGA 实现 DSP 的软件工具 软件和功能 Simulink:动态系统的多域仿真和基于模型设计的平台,提供交 互的图形环境和定制的模块库集合 Platform Studio:包含广泛种类嵌入设计工具、IP、库、引导卡 和设计产生器的集成开发环境, MATLAB:算法开发、数据可视化、数据分析及数值计算的高 算法开发 和优化 级技术计算语言和交互环境, DSP 综合工具提供 MATLAB 与 system Generator 或 ISE 之间的 直接链接,自动产生可综合的 RTL 模型和测试床 Accelchip:直接由 C 语言的程序转换到 FPGA 的硬件 ISE:设计者可用 VHDL 或 Verilog 设计,对 FPGA 编程,利用 System Generator 时,可按批作业模式调用 HDL 仿真 和产生 Synthesis:综合工具 XST/Synplify Pro 可低成本、高效率映射设 计到 FPGA 硬件,按批作业模式选择他们来和 System Generator 一起使用 ModelSim:System Generator 提供必要的接口与 ModelSim 仿真 器连接,可以利用它做 HDL 协同仿真或实时地输入仿真结果到 Simulink/System Generator 仿真 设计校验 和诊断 ChipScope Pro:监视 FPGA 的内部测点,预测和诊断设计,探 测结果可插入到 Simulink/System Generator 内 Xilinx Mentor Graphics Xilinx/Synplicity Xilinx Xilinx MathWorks Xilinx 软件公司 MathWorks

4

§7.2

FPGA 设计 DSP 技术

ISE 实现软件、 System Generator 以及 MATLAB/Simulink 工具之间都有相互配合的版本 问题,对于 ISE8.1 以上的版本,要求相同序号的 System Generator 版本,并配合使用 MATLAB/Simulink7.2 以上的版本,如 R2006a 等。 System Generator8.1 以上的版本,只要执行 SysGenInstall.exe 的执行文件,安装时会自 动找到 MATLAB/Simulink R2006a) ( 的安装目录, Xilinx 的 Blockset 模块集安装到 Simulink 将 中。 7.2.1 浮点数与定点数的表示与转换

在设计仿真中 Simulink 是利用双精度数(double)表示数值,它是 64 位 2 的补码浮点 数,而双精度数对 FPGA 是无效或不实际的。 当利用有限位数来表示二进制数时,二进制点的位置确定了所表示数的范围和精度, 二者的关系是二进制点前面的位数多表示的数值的有效范围大,精度就低,相反,二进制 点后面的位数多,数值精度提高,数值有效范围减小。 例:16 位数值 0001011001101011=213+210+29+26+25+23+21+20 =4096+1024+512+64+32+8+2+1=5739 表示此数需要的二进制位数为 N=log10X / log102 =log105739 / log102 = 3.7588 / 0.3010=12.4866 取最靠近的整数为 13 位。 已知 16 进制的数值可以按照如下方式进行二进制变换和计算数值 166B= 0001 0110 0110 1011 =(1*163)+ (6*162)+ (6*161)+ (B*160) =(1*4096)+(6*256)+(6*16)+(11)=5739 对于 DSP 技术更好的方式理解 2 的补码数是将其符号表示位看作为原始的二进制数的 相应的部分,这个要点是实现时只是这位有负的加权值,所以,2 的补码数值如下计算。 11111111= -27+26+25+24+23+22+21+20 = -128+64+32+16+8+4+2+1 = -128+127 = -1(10) 对于双精度的 64 位 2 的补码浮点数,由于二进制点可以移动,所以在±9.233*1018 之 间的任何数都可以表示,精度为 1.08*10-19,也就是浮点数可以做到数值范围大,精度高, 这也是双精度的含义。由于硬件无法按照双精度的要求进行实现,所以要转换成 N 位的定 点数。 在 Simulink 中 Xilinx 的模块集有三种数据类型: 1. 不带符号的 N 位定点数,表示为 UFix_N_m,其中 N 为二进制位数,m 为二进制 点距离最低位的位置,最大精度为 2 m; 2. 带符号的 N 位定点数,表示为 Fix_N_m,其中 N 为二进制位数,m 为二进制点距 离最低位的位置, 最大精度为 2 m; 3. 布尔类型数,总是定义为 0 或 1,作为控制口的使能(CE)或复位(reset) ,所以 不可以设为无效。

5

例:数值为 -2.261108,表示为 Fix_16_13 的格式, 101.1011110100101= -22+20+2-1+2-3+2-4+2-5+2-6+2-8+2-11+2-13 = -4+1+0.5+0.125+0.0625+0.03125+0.015625+0.00390625+0.00048828125+0.0001220703125 = -2.2611083984375

图 7-3

数据类型

在基于模型的系统设计流程中,当 Xilinx 模块集中的带符号的定点数模块需要与 Simulink 的双精度数模块通信时, 必须要进行数据类型的变换, 这是基于模型的系统设计流 程中重要概念之一。 为了完成这个数据类型变换,要选择 Xilinx 模块集中的 GatewayIn 实现双精度数到定 点数的转换,或者选择 Xilinx 模块集中的 GatewayOut 实现定点数到双精度数的转换。 Gateway In/Out 两个模块可以通过选择参数来控制如何实现双精度数与定点数之间的 相互转换。一般来说,主要由 Gateway In 模块的参数选择来进行控制,除了选择带符号或 不带符号定点数的位数和二进制点位置之外,还需要选择以下两个参数: 1. 量化方式:截断(Trancate)或舍入(Round) ; 2. 溢出方式:饱和(Saturate)或交迭(Wrap) 。 当小数部分的位数不足以表示一个数值的小数部分时,将出现量化的情况,截断是放 弃最低有效位右边的所有位,当有两个等距离最接近表示的数值,舍入将取最接近表示的 数值,或取偏离 0 最远的数值。

图 7-4

双精度浮点数到定点数的转换

例:完全精确数值为: 001.10111101010000 = - 2.2607421875 截断的结果为:Fix_12_9 101.101111010 = - 2.26171875 舍入的结果为:Fix_12_9 101.101111011 = - 2.259765625

6

取决于采用截断还是舍入的方法,对于正的完全精确数值和无符号完全精确数值都会 有不同的输出结果。 例:正的完全精确数值为: 101.10111101010000 = 1.7392578125 截断的结果为:Fix_12_9 101.101111010 = 1.73828125 舍入的结果为:Fix_12_9 101.101111011 = 1.740234375 例:无符号完全精确数值为: 101.10111101010000 = 5.7392578125 截断的结果为:Fix_12_9 101.101111010 = 5.73828125 舍入的结果为:Fix_12_9 101.101111011 = 5.740234375 当一个数值超出了表示的范围将出现溢出,选择饱和时,取最大的正值或最大的负值, 在定点数中选择交迭时,就放弃超出最大有效位的任何有效位。在仿真的过程中出现溢出 将有溢出标志作为 Simulink 的错误产生。 例:完全精确的数值为:01101.1011 = 13.6875 饱和的结果为:Fix_7_4 011.1111 = 3.9375 交迭的结果为:Fix_7_4 101.1011 = - 2.3125 不论选择哪种方式处理量化和溢出, 产生的 HDL 模型和 Simulink 的模型将有相同的行 为特性。究竟选择量化和溢出方式中的哪一种,实际上取决于设计的要求和硬件的实现, 量化方式中截断不增加硬件,而舍入要增加进行进位的硬件资源,所以在满足设计要求的 情况下,应尽量选择截断的量化方式。溢出方式中选择饱和的方式可以防止输出的振荡, 输出数据不再改变,实现上也要增加硬件的资源。 数据类型中的布尔(Boolean)类型是为模块的控制口设计的,如模块的时钟使能(CE) 或复位(reset )口要选择布尔类型,布尔类型是一位的非符号数的变量,与一位的非符号 数的区别是,一位的非符号数可以变为无效,但是布尔类型的数只定义为高或低电平的 1 或 0 两种情况,而不可以变为无效,否则控制口也将失效,系统无法工作。 例:定义以下的 2 的补码二进制分数的格式和计算其数值: 1100011.01011 格式为:Fix_12_5, 数值为:-64+32+2+1+0.25+0.0625+0.03125 = -917/32 = -28.65625 例:什么格式应该利用来表示以下的信号: 1. 最大值为+1,最小值为 -1,量化为 12 位数据:Fix_12_10; 2. 最大值为 0.8,最小值为 0.2,量化为 10 位数据:UFix_10_10; 3. 最大值为 278,最小值为 -138,量化为 11 位数据:Fix_11_1 。 例:求进行加法和乘法运算时,完全精度的输出数据类型。 1. <Fix_12_9> + <Fix_8_3> = <Fix_15_9> 2. <Fix_8_7> * <UFix_8_6> = <Fix_16_13> 利用 Xilinx 的模块集中的模块创建一个 System Generator 的设计, 这些模块是硬件可实 现的 SysGen 模型,此模型必须包含 System Generator 模块,SysGen 模型要通过 I/O 模块作 为 Xilinx 模块集与其他的 Simulink 的模块之间的接口,模型的输入端通过 Gateway In 与 Simulink 的源连接,模型的输出端通过 Gateway Out 与 Simulink 的沉及库函数连接,如图 7-5 所示,模型的仿真和优化就很方便。

7

图 7-5

Simulink 模块的设计模型

7.2.2

采样周期的设置

在 SysGen 模型中的每个 SysGen 信号必须被采样,出现在等距离离散时间点上的瞬间 称为采样时间。在基于模型的 Simulink 建模设计中,每个模块都有“采样周期” ,它常对应 模块的功能如何计算和结果如何输出,所以采样周期是基于模型的系统设计流程中另一个 重要概念。 对于 Gateway In 和模块的 w/o 输入的采样周期必须明确设定,采样周期也可以由其他 模块的输入采样时间来驱动。采样周期的单位可以认为是任意的,但是许多 Simulink 的源 模块有一个时间要素,例如,1/44100 的采样周期意味着模块的功能每间隔 1/44100 秒执行 一次。当设置采样周期时,要遵循奈奎斯特(Niquist)定理。一个模块的采样周期直接与 其在实际硬件中如何定时有关。 在 System Generator 模块的参数中必须设置 Simulink 的系统周期, 对于单数据率的系统, Simulink 的系统周期将与设计中设置的采样周期相同。如图 7-6 所示。

图 7-6

采样周期的设置

8

§7.3

System Generator 模块

在 Xilinx 模块集中,对可以转化为 HDL 代码的模块,其标示都以一个“X”型的水印 来区别于其它的 Simulink 模块。 SysGen 设计, 对 Xilinx 模块集有一些十分重要和特殊的模 块,要给以特别的注意。 模块: 1 System Generator 模块 System Generator 模块是一个极其重要的基本模块,它不仅使得在 Simulink 下建立的 SysGen 模型提供了层次化的表述能力,同时还必须由它来激活代码生成器,以实现模型的 HDL 代码转化。对于一个 SysGen 模型,至少要保证顶层有一个 System Generator 模块。 在一个 SysGen 模型中, System Generator 的参数选择对话窗如图 7-7 所示。 在此窗口中, 要进行定制的参数有: (1)Xilinx System Generator: ① 目标器件的系列、型号、速度等级、封装。 SysGen支持的器件系列有:Virtex -4,Virtex-II Pro,Virtex-II, Virtex-E, Virtex, Spartan3E,Spartan3,Spartan-IIE和Spartan-II系列。 ② 采用的综合工具。 对于选用不同的综合工具,要求生成的代码也有一定的差别。目前支持的综合工具有: Leonardo Spectrum, Synplicity Synplify Pro, Synplify和Xilinx XST。 ③ 目标路径。 设计的目标代码保存的路径。 ④ 产生测试向量复选框。 如果选择了该项,则在生成HDL代码时可以将Simulink仿真输入转换成VHDL测试激励 向量,将Simulink仿真输出转换成对应的VHDL测试输出向量。这些向量可用于所产生的 VHDL代码的行为仿真。

图7-7

System Generator的参数选择对话窗

9

(2)System Period(系统周期):分别设置Simulink的系统周期和实现硬件的系统时 钟周期,前者默认的时间单位是秒,后者为纳秒。 (3)Hierarchical Control(层次控制): ①Override with Doubles: 以双精度浮点的方式仿真Xilinx模块或Simulink模型,替代Xilinx模块的定点方式。设置 为“Override with Doubles”的Xilinx模块显示为灰色。关于Xilinx模块的定点和浮点方式在 Gateway In模块和Gateway Out模块的介绍中详细阐述。在下拉选择框中,可以指定在进行 Simulink仿真时,FPGA设计是根据 “According to Block Masks”模块的屏蔽情况,使用双精度浮点信号取代定点信号; “Everywhere in Subsystem”在子系统中使用双精度浮点信号取代定点信号; “Nowhere in Subsystem”在子系统中不使用双精度浮点信号取代定点信号。 ② Generate Cores:选择在生成VHDL代码的过程中,是否生成Xilinx LogiCOREs。 可选项有: “According to Block Masks”——根据模块的屏蔽情况生成Xilinx LogiCOREs; “Everywhere Available”——在任何可能的地方,都生成Xilinx LogiCOREs, “Nowhere”——不生成Xilinx LogiCOREs。 设置好 System Generator 的参数后,单击 Generate 按钮开始生成 VHDL 代码。如果目 标目录不存在,会提示创建该目录。在代码生成过程中,会显示一个进度条来表示生成进 度。代码生成后,会弹出一个确认信息窗,点击确认即可。 2 Black Box 模块 模块: Black Box 模块是一个十分重要的基本模块,在 Simulink 环境里,并不是所有的硬件结 构都可以通过 Xilinx 模块集中的模块进行组合来实现;但为了能进行设计系统的模型仿真, 设计的 Simulink 模型又应该是一个完整的模型。黑匣子(Black Box)模块就是专门设计用 来解决这种矛盾,提供 Simulink 模型与构造的 HDL 源码之间的接口。此外,在设计中,某 些组件可能已经用 VHDL 或 Verilog 设计好了可直接调用,或者某些组件直接用 VHDL 编 写比起在 Simulink 里建模要更为简单些。这些情况下,都要选用 Black Box 模块。 Black Box 模块的使用方法是: (1)将 Black Box 模块添加到模型中; 对 Black Box 模块的要求: 与 Black Box 模块有关的 VHDL 元件必须遵从以下 System Generator 的要求和规定: 1. 实体名称必须与设计中任何其他实体的名称不同; 2. 在顶层的实体中不允许双向端口; 3. 不是时钟或时钟使能的任何端口必须具有 std_logic_vector 的数据类型; 4. 是时钟或时钟使能的任何端口必须具有 std_logic 的数据类型; 顶层的 VHDL 程序必须为每个 Simulink 中有关的采样率设置分别的时钟和时钟使能端 口。 在 black Box 的 VHDL 程序中时钟和时钟使能端口应该如下表示: 1. 时钟和时钟使能信号必须成对地出现; 2. 虽然 Black Box 可以有多个时钟端口,但利用单个时钟源驱动每个时钟端口; 3. 只有时钟使能的速率是不同的; 4. 每个时钟的名称(和每个时钟使能的名称)必须包含 clk(和 ce)的字符;

10

5. 时钟使能的名称必须与相应的时钟名称相同,只是 clk 用 ce 代替。 时钟和时钟使能端口在 Black Box 模块的图框中不可见。 Black Box 模块必须通过一个 MATLAB 的 M 函数的文件描述它的接口,例如,端口和 generics,设计的实现,通过 HDL 协同仿真的仿真模型等。 这个 M 函数文件的名称应该在模块参数对话框中进行规定。 M 函数的配置文件要完成以下的工作: 1. 规定 HDL 元件的顶层实体名称,它应该与 black box 名称一致; 例:this_block.setEntityName('fir_blackbox'); 2. 选择语言(即 VHDL 或 Verilog) ; 例:this_block.setTopLevelLanguage('VHDL'); 3. 描述端口,包括类型、方向、位宽度、二进制点位置、名称和采样率; 例:this_block.addSimulinkInport('reset'); this_block.addSimulinkInport('din'); this_block.addSimulinkOutport('dout'); dout_port.setType('Fix_30_0'); 4. 定义由此 black box 的 HDL 要求的任何 generics; 5. 规定此 black box 的 HDL 和与此模块有关的其它文件 (例如 EDIF) ; 例:this_block.addFile('fir.edn'); -- added entries this_block.addFile('fir.mif'); this_block.addFile('fir.vhd'); 6. 定义为此模块的时钟和时钟使能; 7. 定义是否此 HDL 有任何组合的通过反馈的路径。 (2)如果在模型的项目路径下含有 VHDL 文件,自动执行一个配置向导,选择相应的 HDL 文件,如图 7-8 所示;



7-8

Black Box参数定制对话窗

(3)设置Black Box的参数,如图7-9所示。

11

图7-9

Black Box参数设置对话框

Black Box的参数包括以下几项: (1)Block Congiguration M-Function:规定Black Box模块配置M函数的名称。M函数 可以是手工编写的,也可以是由配置向导自动生成的。 Black Box必须通过MATLAB M函数描述它的接口:例如端口、通用属性(generics) 、 它的实现、选项和HDL协同仿真的仿真模型等。 配置M函数完成以下任务: 1. 规定与Black Box模块有关的HDL元件的顶层实体名称; 2. 规定使用的语言(VHAL 或 Verilog) ; 3. 描述端口,包括类型、方向、位宽度、二进制点位置和采样率; 4. 定义由Black Box模块的HDL元件要求任何通用属性(generics) ; 5. 规定Black Box模块的HDL元件和与此模块有关的其他文件(如EDIF) ; 6. 定义模块的时钟和时钟使能 7. 说明是否HDL元件有任何通过反馈的组合路径; (2)Simulation Mode:有“Inactive”和“Use HDL Co-Simulation”两个选项。如果是前 者的话,那么在仿真是,将忽略输入始终输出零。如果是后者的话,则使用HDL协同仿真。 这时,需要在模型中新增一个ModelSim模块,并在Black Box模块的“HDL Co-Simulator To Use (specify helper block by name)”中指定该ModelSim模块。 (3)FPGA Area:提供用于资源使用估算的信息。 在生成代码时,该子系统功能的硬件实现直接使用指定的VHDL文件。也可以使用 Verilog文件,但这时必须人工编写模块的M函数。进行仿真时,Black Box模块通过结合 Simulation Multiplexer模块和ModelSim模块有多种灵活的仿真方法。

12

3 ModelSim模块 模块 ModelSim HDL 协同仿真模块配置和控制对一个或几个 Black Box 模块的协同仿真。这 个模块完成以下工作: 1. 构造为允许 black box HDL 在 ModelSim 中被仿真所需要的附加 VHDL; 2. 当 Simulink 仿真开始时引起 ModelSim 一个对话时间; 3. 传递 在 Simulink 和 ModelSim 之间的通信; 4. 当 black box HDL 被编译时报告是否有错误内检测; 5. 当仿真完成时,如果合适终止 ModelSim。 在仿真期间, 每个 ModelSim 模块引起一个 ModelSim 的拷贝, 所以利用 ModelSim 一 个 license,如果 license 是不足的,几个 black boxe 模块可以共享此相同的模块,除了灵活 性差, 采用这个方式没有东西损失, ModelSim 中的时间刻度匹配在 Simulink 中的时间刻 在 度, i.e., one second of Simulink 的一秒仿真时间对应 ModelSim 的一秒仿真时间。 即, 参数选 择如图 7-10 所示。

图 7-10

ModelSim 模块参数选择

模块: 4 Gateway In 模块和 Gateway Out 模块 对于 Simulink 仿真,通常的 Simulink 模型都是浮点仿真。而对于用 Xilinx 模块实现的 设计,由于最终是要用 FPGA 完成一个硬件电路的实现,因而在默认方式下,Simulink 中 的 Xilinx 模块是进行定点仿真,而其余的 Simulink 一般模块是做浮点仿真。 Matlab IO(接口模块)组中的 Gateway In 模块和 Gateway Out 模块提供了 FPGA 设计 (定点)和通常 Simulink 模块(浮点)之间的接口功能。Gateway In 模块将其它 Simulink 模块的双精度浮点数据转换成 Xilinx FPGA 需要的定点数据, Gateway Out 模块则正好相 而 反。可以在一个实例中,选中“Format”菜单里的“Port data types”来验证。 但是有的时候,在用户选择定点宽度,或者用定点方式仿真 FPGA 设计没有得到期望 的结果或结果不正确时,用户就希望,可以选择以双精度浮点的方式仿真整个系统或特定 的某些模块, 以帮助发现 FPGA 设计的哪一部分存在量化错误。 这时就可以通过设置 Xilinx 模块参数中的“Override with Double”项,并配合以 System Generator 模块里的相应设置来实 现。

13

模块、 模块、 5. Concat 模块、Convert 模块、Reinterpret 模块和 Slice 模块 在以下的一些情况下,可以利用这些模块来完成所需做的工作: 1. 将两个数据总线组合起来形成一个新的总线; 2. 强迫进行包括位数和二进制点的数据类型变换; 3. 重置无符号数为符号数或符号数为无符号数; 4. 在数据位增长时提取数据的指定位。 Concat 模块 模块: 此模块执行两个位矢量的连接,模块的两个输入必须是无符号的整数,例如两个二进 制点位于 0 的无符号数,或者利用 Reinterpret 模块所提供的符号数变换为无符号数的能力, 达到扩展 Concat 模块的功能, Convert 模块 模块: Convert 模块可以把每个输入采样变换为所需算术类型的数。 1. 一个数可以变换到 2 的补码的符号数或无符号的数值; 2. 总位数和二进制点由设计者规定; 3. 舍入和量化选择加到输出数值; 4. 取决于溢出和量化的选择可以利用附加的硬件,而不利用 LogiCore。 在规定总位数和二进制点位置,符号或无符号的算术类型后,模块首先排齐输入和输 出端口类型之间的二进制点,然后利用规定的总位数和二进制点,与利用的溢出和量化选 择有关,输出可能按抛下的位相反地变化。饱和溢出改变小数的数值为得到饱和的数值。 舍入量化也可能影响到二进制点左边的数值。 例:以下数值通过 Convert 模块导致利用不同位数和二进制点有相同的结果。 原始数值: Fix_10_8 01.10000000 变换为: Fix _7_4 001.1000 变换为: Fix_6_0 000010. (舍入) 000001. (结尾) Reinterpret 模块 模块: 为保持输入端表示的数值,无任何考虑地强迫其输出为新的类型。输入端总的位数等 于输出端总位数,允许无符号位数据重置为符号位数据,或符号位数据重置为无符号位数 据。也允许通过重新放置二进制点缩放数据。 例:重置以下的数值,迫使二进制点到位置 5。 输入数据为: Fix_10_8 01.10000000 = +1.5 输出数据为: Fix_10_5 01100.00000 = +12 Slice 模块 Slice 模块允许从输入数据移位出一系列的位,产生一个新的数据值,输出数据是无符 号数,二进制点在位置 0 处。 例: 取 Fix_10_8 符号数的 4 位移动,偏置最低位 5 位。 输入数据为:Fix_10_8 01.10000000 = +1.5 输出数据为 1100 = 12 较高位位置 + 宽度:从 MSB 的顶位 = 0 偏置,宽度 = 4 输出数据为 01100.00000 = 6 两个位置定位:从 MSB 的顶位 = -1 偏置, 从LSB 的位 = 5 偏置 输出数据为 01100.00000 = 12

14

模块通用属性 双击 Xilinx 的模块,在弹出的参数设置对话窗中,有一些参数的设置是具有普遍性的。 运算数据类型: 。 (1)Arithmetic Type 运算数据类型:指定输出信号是无符号或带符号(二进制补码) ) 核实现: (2)Implement with Xilinx Smart-IP Core (if possible)采用 Xilinx Smart-IP 核实现: ) 采用 复选项,选中则用实现核例示的 VHDL 代码来实现该模块,否则只生成可综合的 VHDL 代 码。如果不能完成核的例示,则自己生成可综合的 VHDL 代码。 生成核: (3)Generate Core 生成核:见前面介绍的几个重要模块 ) 对核使用布局要求: (4)Use Placement Information for Core 对核使用布局要求:选中该项通常会加快核 ) 的实现,但由于添加了约束,可能导致布局布线失败。 延迟: (5)Latency 延迟:输出延迟周期。 ) 精度: (6)Precision 精度:缺省情况下为“Full”,保证有足够的精度不致出错;用户也可以 ) 选择“User-Defined”来自己设定。 位数: (7)Number of Bits 位数:设置定点数的位长,其中包括“Binary Point”,设定二进制 ) 小数点的位置。设置不合理,会导致溢出和量化错误。 溢出和量化错误处理: (8)Overflow and Quantization 溢出和量化错误处理:用户对定点数设置不当,会导 ) 致溢出和量化错误。发生溢出时,出错处理可以是“Saturate”(输出可表示的最大正值或最 小负值) 、“Warp” (截顶) 或“Error” (直接报错) 发生量化错误时, 。 出错处理可以是“Round” (舍入)或“Truncate”(截尾) 。 (9)Override with Doubles:见前面介绍的几个重要模块。 ) : 提供复位端: (10)Provide Reset Port 提供复位端:是否为模块提供复位端口。 ) 提供使能端: (11)Provide Enable Port 提供使能端:是否为模块提供使能端口。 ) (12)Use Explicit Sample Period 使用外部采样周期:选中该项可较好的解决模型中 ) 使用外部采样周期: 的环路时序。 (13)FPGA Area(Slices,FFs,LUTs,IOBs,Embedded Mults,TBUFs) FPGA 资 ) 源使用:提供模块资源使用的估算信息,以便“Resource Estimator”模块进行系统资源耗用估 算。一维数组中的数字分别对应相同位置上所指的硬件资源的耗用情况。

图 7-11

计数器的各种参数选项

15

§7.4

设计 FIR 滤波器

设计描述 一个单通道、单速率滤波器的技术指标为: ? 采样频率 Sampling Frequency (Fs) = 1.5 MHz ? 截止频率 1 Fstop 1 = 270 kHz ? 通带频率 1 Fpass 1 = 300 kHz ? 通带频率 2 Fpass 2 = 450 khz ? 截止频率 2 Fstop 2 = 480 kHz ? 通带两边衰减 Attenuation on both sides of the passband = 54 dB ? 通带起伏 Pass band ripple = 1 两个不同的信源利用来仿真此滤波器: ? 线性调频 chirp 模块,它在 6 KHz 和 10 KHz 规定的频率之间扫描,不考虑瞬 时输出频率。 ? 随机信源发生器,它在-1.9 到 1.9 的范围内输出均匀分布的随机信号,均匀分布 是驱动定点滤波器更好的选择,因为滤波器是受限的。 一 产生 FIR 滤波器的系数 利用 MATLAB console 窗口,从 d:/DSP/ lab4 目录打开 bandpass_filter.mdl 模块, 从 Xilinx Blockset → DSP 模块集添加 FDATool 模块到设计中。在 d:/DSP/lab4 目录中利用 FDATool 模块为以下的技术指标产生 FIR 滤波器的系数。 ? 采样频率 Sampling Frequency (Fs) = 1.5 MHz ? 截止频率 1 Fstop 1 = 270 KHz ? 通带频率 1 Fpass 1 = 300 KHz ? 通带频率 2 Fpass 2 = 450 Khz ? 截止频率 2 Fstop 2 = 480 KHz ? 通带两边衰减 Attenuation on both sides of the passband = 54 dB ? 通带波纹 Pass band ripple = 1 1. 双击桌面上 MATLAB 图标或 Start Menu All Programs MATLAB R2006a 打开 MATLAB 指令窗口。 2.在指令窗口键入 cd d:/DSP/ lab4/ ,将目录转到所设目录下。 3.从 MATLAB 的控制台窗口打开 bandpass_filter.mdl 模块。 4.从 Xilinx Blockset → DSP 添加滤波器设计分析工具 FDATool 到设计中。 5.在 FDATool Design Filter 窗口 (图 7-12)输入以下的滤波器参数。 ? Filter Type: Bandpass ? Units: KHz ? Sampling Frequency (Fs) = 1.5 MHz ? Fstop 1 = 270 KHz ? Fpass 1 = 300 KHz ? Fpass 2 = 450 Khz ? Fstop 2 = 480 KHz

16

? Attenuation on both sides of the passband = 54 dB (Astop1 and Astop2 parameters) ? Pass band ripple = 1 (Apass)

图 7-12

在 FDATool 中设计一个滤波器.

6. 点击 Design Filter 按钮确定滤波器的阶数。 频谱窗口将被更新,如图 7-13 所示。

图 7-13

所设计滤波器的幅度和相位响应

问题:根据所定义的技术指标,最小滤波器的阶数是多少?

17

7. 利用 File → Save Session 以 fda 格式保存系数文件在 coefficients.fda 中。 注意:这是一个可选的步骤。系数对于设计仍然是有效的。如果把系数保存在 fda 文件中,则系数在以后可以通过 FDATool 模块参数对话框加载。 8. 利用 File → Export 输出系数以 Num 为名称到 Workspace 中。(图 7-14 ) 注意:在 MATLAB workspace 中将添加 Num 变量。对于 FIR 滤波器,Num 表示 在设计中利用的系数。这也是一个可选的步骤,因为系数通过 FDATool 模块仍然 是有效的。

图 7-14

输出系数到 Workspace

9. 在 MATLAB 控制台窗口键入 Num,观察系数清单。 10. 在 MATLAB 控制台窗口键入 max(Num),确定最大的系数值,它相应地规定 系数的宽度和二进制点数。 问题:填写与系数有关的以下信息: Maximum value: ________________ Minimum value: 二 把系数与 FIR 滤波器联系起来 从 Xilinx Blockset → DSP 库添加 DAFIR v9.0 滤波器模块, 并与产生的系数联系起来。 1. 2. 从 Xilinx Blockset → DSP 库添加 DAFIR v9.0 滤波器模块到设计中。 双击 Xilinx DAFIR v9.0 滤波器模块, 在模块参数窗口输入以下的参数。 7-15) (图 ? ? ? ? ? ? Coefficients : xlfda_numerator(‘FDATool’) Coefficient Structure : 选择 Inferred from Coefficients Number of bits per Coefficients : 12 Binary Point for Coefficients : 12 Number of Channels : 1 Provide Valid Ports : 不选

18

图 7-15

FIR 滤波器模块参数

3. 点击 OK 接受这些设置。 4. 连接此模块,使设计类似于图 7-16。

图 7-16

FIR 滤波器模块基本设计准备仿真



在 Simulink 中仿真 FIR 滤波器

设置采样输入为 FIX_8_6, 输入采样周期为 1/1500000, , 连接 FIR 模块到 Gateway In 和 Gateway Out 端口,利用频谱仪研究它对线性调频和噪声信号的输出。 1 。 双击 Gateway In 模块,设置格式 format 为 FIX_8_6, 采样周期为 , 1/1500000。 。 2. 选择线性调频 Chirp 信源,启动仿真。 注意:以下的警告信息出现,因为 Simulink 计算不同的采样率,需要更新它。

19

图 7-17

警告信息指示计算的采样率

3. 点击 Update 接受采样率的变更,并返回仿真。 4. 将频谱的屏幕放到前台,检查由 FIR 滤波器输出的信号已经被衰减,如图 7-18 和图 7-19 所示。

图 7-18

在通带中没有衰减(频谱屏幕)

图 7-19

在止带中衰减(频谱屏幕)

20

5。 停止仿真。 注意: 当停止仿真时, 一个关于滤波器滞后的错误被报告。 此时可以不考虑此错误。

图 7-20

对于滞后不兼容的错误报告

6. 点击 Close 。 7. 选择 Random Source,运行仿真。

图 7-21

随机信源(频谱屏幕)

8.停止仿真。 四 完成 FIR 滤波器设计

从 Xilinx Blockset → Basic Elements 库添加 convert 模块以得到 FIX_8_6 的输 出,从 Xilinx Blockset → Basic Elements 库添加 delay 元件到输出端改善性能,从 Xilinx Blockset → Index 库添加 Resource Estimator 模块。

21

1. 从 Xilinx Blockset → Basic Elements 库添加 convert 模块到 FIR 输出端使得 出为 FIX_8_6。 2 从 Xilinx Blockset → Basic Elements 库添加 delay 元件到输出端,提供流水 线和改善性能,因为添加的流水线级将在输出焊盘中实现。 确认 DAFIR v9.0 系数的尺寸被设置为 FIX_12_12 和 Gateway In 尺寸设置为 FIX_8_6。 改变输入 (Gateway In)的 quantization 为 Truncate ,改变 Overflow 为 Wrap。 3.从 Xilinx Blockset → Index 库添加 Resource Estimator 模块到设计中。 注意:设计应该如图 7-22 所示。

图 7-22

完成的 FIR 滤波器设计



实现 FIR 滤波器

设置 FIR 硬件过采样率为 (Hardware Over-Sampling Rate) 9, FIR Core Latency 为 为 14,运行仿真。这将更新采样率为 7.407e-008。利用 System Generator 标记产生编 码和以下的技术条件。在 Project Navigator 中打开 bandpass_filter.npl 项目,并综合 和实现设计。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? Input : Width = FIX_8_6, Quantization = Truncate, Overflow = Wrap Output Width: FIX_8_6 FIR Core Latency: 14 FIR Hardware Over-Sampling Rate: 9 FIR Coefficients: FIX_12_12 Product Family: Spartan Device: xc3s200 Speed: 7 Package: ft256 Synthesis Tool: XST Target Directory: D:/dsp_E/lab4/netlist Create Testbench: Unchecked Simulink System Period (sec): 7.407e-008 FPGA System Clock Period (ns): 20

22

1. 双击 FIR 模块,设置硬件过采样率为 9 和滞后为 14。 问题:硬件过采样率为 9 告诉你关于滤波器实现什么? 为什么设置为 9 而不是 8? 2. 运行仿真。采样率更新的信息将出现,接受采样率为 7.407e-008,并重新运行 仿真。 3. 双击 System Generator 图标,设置以下的参数: . ? Product Family: Spartan ? Device: xc3s200 ? Speed: 7 ? Package: ft256 ? Synthesis Tool: XST ? Target Directory: c:/ dsp_E/lab4/netlist ? Create Testbench: Unchecked ? Simulink System Period (sec): 7.407e-008 ? FPGA System Clock Period (ns): 20 4. 点击 Generate 按钮以产生设计。 5. 在 Windows Explorer 中,双击 bandpass_filter_clk_wrapper.npl 打开 Project Navigator 。 6. 综合和实现设计。 问题:利用各种报告,给出以下各项的答案 Number of Slices: Has the timing constraint met? The actual clock period: 已知所选择的一系列实现,实际采样率是多少? 六 利用资源估计器估计设计

利用 Resource Estimator 模块和 post-map 报告,估计此设计利用的资源。 1. 双击 resource estimator 模块。 2. 点击 Post-Map Area 按钮,选择 bandpass_filter_clk_wrapper.mrp 文件。 问题:资源估计器报告的结果? Number of Slices: Number of FFs: Number of LUTs: 七 执行硬件在环路中的校验 利用 System Generator 图标,产生硬件和校验,产生硬件和通过演示板校验设计 工作,通过 Simulink 仿真设计。. 1. 保存模型为 bandpass_filter_hwcosim.mdl 2. 双击 System Generator 图标,设置以下的参数。

23

? Compilation: Digilent D2SB ? Synthesis Tool: XST ? Target Directory: D:/ dsp_E/lab4/ise_sp2e ? Create Testbench: Unchecked ? Simulink System Period (sec): 7.407e-008 注意:确认 System Generator block’s 的图标显示 Spartan2E xc2s200e-6pq208 为器件 。 2. 点击 Generate 按钮,编译状态窗口打开如图 7-23 所示的编译过程的进展。

图 7-23

在指令窗口中编译的进展

3.

当设计生成成功地完成时,新的 Simulink 库窗口将打开,一个带有相应数量 输入和输出的被编译的模块将显示。

图 7-24

在新的 Simulink 窗口打开的被编译的模块

4.

拷贝被编译的模块到设计中,如图 7-25 所示连接此模块。

图 7-25

准备硬件在环路中仿真完成的设计

24



连接演示板, 仿真设计. 连接演示板,通过 Simulink 仿真设计

1. 连接电源电缆到 DIGILENT_3S 演示板,点亮板上一个 LED。 2. 连接并行电缆到演示板上提供 JTAG 连接器的一边和计算机并口的另一边。 3. 在 Simulink 窗口点击 run 按钮 ( 仿真将被运行。 4. 仿真结果在输出屏幕上显示,Simulink 仿真器输出在左边,硬件输出在右边, 如图 7-26 所示。 ) 运行仿真,配置的位流文件将被下载,

图 7-26

两种输入仿真结果显示,Simulink 输出在左边,硬件输出在右边。 。

5. 当完成后关闭电源。 6. 保存设计模型,关闭 MATLAB。

25

§7.5

利用协同仿真校验 MAC FIR 滤波器

一 产生 MAC FIR 核 利用 Core Generator 产生一个单通道和单速率 MAC FIR 核,在 d:\DSP \ \lab5 目 录中对 Spartan2e 器件系列有以下技术条件。 1. 利用 Start Menu Programs Xilinx ISE 8.1i Accessories Core Generator 打开 Core Generator System。 2. 在 Getting Started 对话框中点击 Create a New Project 按钮。 弹出图 7-27 所示 的对话框。

图 7-27

SysGen 建立新项目

3. 键入新项目名称后,选择项目所利用的 FPGA 器件,如图 7-28。

图 7-28

项目的器件设置

4. 在 Generation 标题下选择以下的选项,点击 OK ? ? ? ? Output Options : Flow Vendor Design Entry : VHDL, Other Overwrite Files : False Netlist Bus Format: B<I>

5. 左窗口中双击 Digital Signal Processing → Filters 后选择 MAC FIR Filter 核, 如图 7-29。

26

图 7-29

滤波器的 IP 核选择

6. 双击 MAC FIR Core 入口,打开配置窗口,如图 7-30。

图 7-30

MAC FIR 滤波器的参数设置

7. 在 MAC FIR 配置窗口选择以下五步骤中的选项 Page 1: Component Name: fir Single Rate FIR : Selected Channels : 1 Page 2: Taps : 92 Impulse Response : Non-Symmetric

27

Coefficient Width : 12 Coefficient Type : Signed Coefficient Buffer Type : Block Memory Page 3: Data Width : 8 Data Type : Signed Data Buffer Type : Block RAM Click the Load Coefficients button and select coef.coe file Page 4: Performance Optimization : Auto System Clock Rate : 50.0 MHz Input Sample Rate : 1.5 MHz Registered Output : Checked Page 5: Shows the configuration statistics. Note the Result width (=27) and Latency (=55) 8. 点击 Generate 产生核。图 7-31 为滤波器设计产生的文件。

图 7-31

滤波器设计产生的文件清单

9. 当成功地生成时,点击 OK。 10. 关闭 Core Generator。 。

28

二 打开称为 fir_blackbox.vhd 文件的封装文件, 并修改它包含的所有输入信号的类型 为 std_logic_vector 类型,除 clock 和 clock-enable 之外。一般,这个文件必须由用户 产生,这个文件需要提供“时钟使能”时钟电路,它是与 System Generator 模块集接 口所必须的。 1 利用 M 编辑器或 WordPad 应用, d:\DSP\lab5 打开 fir_blackbox.vhd 封装文件。 从 注意:为了方便,这个文件已提供。实际上,这个文件必须为这个有时钟但没有时钟 使能的核产生 (如同此情况)。 2. 在 fir_blackbox 实体中修改 reset 端口输入,使它为尺寸 1 的 std_logic_vector, 如下所示, reset : in std_logic_vector(0 downto 0); 3. 未注释的 U1 实例(全部 7 行) 包含 to include the instance of the fir 核模块的实例。 保存此文件,并关闭它。
LIBRARY std, ieee; USE std.standard.ALL; USE ieee.std_logic_1164.ALL; entity fir_blackbox is port ( input_clk : in std_logic; input_ce : in std_logic; reset : in std_logic; -- std_logic_vector(0 downto 0); din : in std_logic_vector(7 downto 0); dout : out std_logic_vector(26 downto 0) ); end fir_blackbox; architecture bb_arch of fir_blackbox is component fir IS PORT ( CLK : IN STD_LOGIC; RESET : IN STD_LOGIC; ND : IN STD_LOGIC; DIN : IN STD_LOGIC_VECTOR(7 DOWNTO 0); RDY : OUT STD_LOGIC; RFD : OUT STD_LOGIC; DOUT : OUT STD_LOGIC_VECTOR(26 DOWNTO 0) ); END component; -- XST black box declaration attribute box_type : string; attribute box_type of fir: component is "black_box"; begin -- u1 : fir -port map ( -clk => input_clk, -reset => reset(0), -nd => input_ce, -din => din, -dout => dout); end bb_arch;

29

——步骤 三 为 HDL 协同仿真完成 MAC FIR 的设计 ——步骤 2 利用 MATLAB 控制台窗口,从 d:\DSP\lab5 目录打开 fir_bb_hdlcosim.mdl 模块。从 Xilinx Blockset → Basic Elements 模 块 集 添 加 Black Box 模 块 到 设 计 中 。 分 配 fir_blackbox.vhd 文件到此 Black Box 模块。 1. 在桌面上双击 MATLAB 图标打开 MATLAB 指令窗口, 或经过 Start Menu Programs MATLAB 6.5 MATLAB 6.5 来打开。 2. 改变目录到 d:/DSP/lab5/: 在指令窗口键入 cd d:/DSP/lab5/ 3. 从 MATLAB 控制台窗口打开 fir_bb_hdlcosim.mdl 模块。 一个含输入、输出和显示屏和 System Generator 图标的模型将包含在如图 7-32 所 示的模型。

图 7-32

fir_bb_hdlcosim 模型

从 Xilinx Blockset → Basic Elements 库添加 Black Box 模块到设计中。 4. 一个 Black Box 配置文件窗口弹出,显示有效的 VHDL 文件 (图 7-33 )。

图 7-33

Black Box 配置文件对话框

30

5. 选择 d:\DSP_E\lab5\fir_blackbox.vhd 文件,并点击 Parse Selected VHDL 按钮分 配它作为顶层实体。 这个 Black Box 图标带有相应数量的端口和端口名称将添加到图 7-33 所示的设计中。

图 7-34

Black Box 模块添加到设计中

一个配置文件也被打开,用一个顶层的 VHDL 实体输入,通过它 Black Box 将连接到 仿真器。浏览整个配置文件和理解文件中的主要元件。注意到只访问的 VHDL 文件是顶层 实体。为编译 ModelSim 仿真器,它要求所有层次文件按照相应的次序输入。

图 7-35

在 Black Box 连接期间产生的配置文件

6. 在 this_block.addFile('fir_blackbox.vhd')之前添加以下行的实体 this_block.addFile('fir.edn'); this_block.addFile('DATA_COEF_BUFFER_AA2.mif'); this_block.addFile('DATA_COEF_BUFFER_AB2.mif'); this_block.addFile('DATA_COEF_BUFFER_B1.mif'); this_block.addFile('fir.mif');

31

this_block.addFile('fir.vhd'); 7. 利用 File → Save 保存配置文件,并关闭编辑器。 8. 修改指明输出端口尺寸 27 的 UFIX 类型为 to FIX 类型这一行 (如下所示)。 dout_port.setType('Fix_27_0'); 五 连接 Black Box 图标到设计的输入和输出,从 Xilinx Blockset → Tools 库添加 ModelSim 图标。使协同仿真模式激活,并分配 ModelSim 作为协同仿真模块。 1. 连接 Black Box 图标到输入和输出,连接好的设计应该如图 7-36 所示。

图 7-36

完成包含 ModelSim 图标的设计

2

双击 Balck Box 模块,如图 7-37 所示选择 ISE Simulator 的仿真模式。

图 7-37

协同仿真目录链接

4. 点击 OK 接受这些设置。 5. 保存这个设计模型。

32

——步骤 六 执行 HDL 协同仿真 ——步骤 3 设置仿真的 stop time 为 100 ,运行仿真,研究其输出,应该在输出窗口看到显示 的滤波器系数的轮廓。 1. 利用 Simulation → Simulation parameters ,在 Stop time 栏内键入 100,设置 仿真的停止时间为 100。 2. 在 MATLAB 命令窗口键入 Ts=1,并按回车。 3. 点击 Run ( ) 按钮启动仿真。

ISIM 仿真器将被后台调用,结果将显示在 Simulink 的 Scope 窗口中。也将看到指示 Simulink 系统周期无效设置的警告信息,如图 7-38 所示。

图 7-38

Simulink 系统周期无效设置的警告信息

4.当仿真过程开始,在 Simulink 窗口点击显示屏幕模块,观察其输出,如图 7-39 所示。

图 7-39

显示输入和输出的屏幕

5. 让仿真运行完成,观察屏幕上的输出,如图 7-40 所示。

33

图 7-40

显示整个运行输入和输出的屏幕

6. 关闭屏幕 scope 窗口。 7. 保存设计模型。 附:如果 Black Box 的仿真模型选择 External Co-simulator,先在 Xilinx Blockset 中将 ModelSim 模块拖入设计中,然后双击 Black Box 模块,在弹出的菜单中为仿真模型选择 External Co-simulator,并在 HDL Co-simulator 框中键入 ModelSim,点击 OK。 运行 Simulink 时,将调用 ModelSim。 观察 ModelSim 输出窗口显示的全部信号,如图 7-41 所示。Scope 窗口中可以得到利 用 ISE Simulator 相同的结果。 最后,利用仿真器的副窗口中的 File → Quit 关闭 ModelSim 仿真器。

图 7-41

ModelSim 输出显示整个运行

34

七 执行硬件在环路校验 利用 System Generator 图标,产生硬件,校验通过演示板的设计工作。 1. 利用 File → Save As,在文件名称栏键入 fir_hwcosim 保存设计模型为 , fir_hwcosim.mdl。 2. 双击 System Generator 图标,并设置以下的参数: ? Compilation: Digilent _3S. (选择硬件协同仿真 → Digilent_3S) ? Target Directory: d:/DSP/lab5/sp2e. 确认 System Generator 模块的窗口显示 part 为 Spartan xc3s200-4ft256 的器件。

图 7-42

System Generator GUI 显示器件和速度

3. 点击 Generate 按钮,当生成成功地完成时,新的 Simulink 库窗口将打开,一 个带有相应数量输入和输出的被编译的模块将显示。 4. 拷贝 fir__bb_hdlcosim_hwcosim 模块,并将其添加到设计中,移去 black box 图标,连接 fir_bb_hdlcosim_hwcosim 到相应的输入和输出完成这个设计。 八 连接演示板通过 Simulink.仿真设计 仿真设计

1. 连接电源电缆到演示板,点亮板上一个 LED。 2. 连接并行电缆到演示板上提供 JTAG 连接器的一边和计算机并口的另一边。 3. 在 Simulink 窗口点击 run 按钮 ( 仿真将被运行。 ) 运行仿真,配置的位流文件将被下载,

35

图 7-43

设计项目中添加硬件协同仿真模块

4. 仿真结果在输出屏幕上显示。如图 28 所示,按照图 7-42 所示的连接,图 7-44 的上部为经过 FPGA 硬件输出的结果, 下部为经过 Black Box 模块的仿真结果。

图 7-44

仿真结果显示硬件输出在上部,Simulink 仿真在下部

5. 当完成时关闭电源。 6. 保存设计模型,关闭 MATLAB。

36

§7.6

设计 MAC FIR 滤波器

前两个设计项目成功地运行已经使你掌握构造一个基于 MAC 滤波器的要求,以致 System Generator 库元件可以被创建。这个提供了访问由其他设计工程师产生的滤波器的 方便,所以他们可以利用这个结构在其他项目中。它也可以容易地改造和适应在 System Generator 中的 DSP 设计环境。这个滤波器仍然需要参数化,达到系数可以对不同的滤波 器技术条件改变。
Sample Memory ? Cyclic RAM buffer. ? Depth = Taps. ? Width = Sample size.

Full Multiplier ? Sample-width × max Coeff-width 8

Samplein Sample Address

Samples 92 × 8 12

×

20

+ +

27
DQ

CE DQ

27

Coefficient Address

Coefficients 92 × 12 Accumulator. ? Sample-width depends on no. of taps

Capture of final result. ? Simple register. ? Supports result size.

图 7-45

MAC FIR 滤波器结构

如图 7-45 是基于 MAC FIR 滤波器的结构图, 系数和数据需要存储在存储器系统中, 为 储存有几个存储选项:块 RAM、分布 RAM 和移位寄存器 SRL16E 等。在这个实验中将利 用双口块 RAM 存储器来储存数据和系数,随数据被截获,利用循环数据 RAM 缓冲器。所 以 RAM 按混合模式配置, 数据从口 A 写入和读出 (RAM 模式) 系数只从口 B 读出 , (ROM 模式),具有循环 RAM 缓冲器的完全存储器系统如图 7-46 所示。
DIN_A CE CYCLIC COUNTER 0 – -1 WE Data_addr

0
A

N-1

LOGIC DIN_B

N ROM
WE_B B

CYCLIC COUNTER N – -1 WE

Coef_addr 2N-1 RAM MUST BE: READ AFTER WRITE WE WE

DIN Data_addr

1

X 0 93 94 3

X X X …91 92 91 0 1 95 … 183 93 94 95

X X X 2 91 96

X 0 1 92

X

Coef_addr 92

183

图 7-46

循环 RAM 缓冲器

37



分析系数 在 MATLAB 中 从 d:/DSP_E/lab8 目录打开 mac_bandpass.mdl 模块,利用几个 MATLAB 指令如 max 和 min 分析系数,观察系数,理解对信源的参数设置。 1. 在桌面上双击 MATLAB 图标打开 MATLAB 指令窗口, 或经过 Start Menu Programs MATLAB 6.5 MATLAB 6.5 来打开。 2. 改变目录到 d:/DSP_E/lab5/: 在指令窗口键入 cd d:/DSP/lab5/

3. 从 MATLAB 控制台窗口打开 mac_bandpass.mdl 模块。 注意:这个滤波器要求的系数将加载到工作空间,变量 coef 和采样周期变量 Ts 打 开此文件。 在 MATLAB 指令行键入 coef 观察系数。 4. 键入 max(coef) 观察最大系数值。 5. 键入 min(coef) 观察最小系数值。 问题 1:技术条件要求 12 位数据的系数。对 12 位系数的最佳格式是什么? 6. 取已经产生的输入信源的数据。 7. 双击转换开关在信源之间选择。 二 添加控制逻辑并对它参数化

设计控制逻辑,用变量 coef 对它参数化,设置采样周期 Ts,因为只对仿真控制逻 辑感兴趣。仿真参数化后的逻辑校验它仍按照期望进行工作。 1. 在 MATLAB 中,从 File——New——Model,新建一个子模型,保存为 counter_enabled.mdl 。 2. 如图 7-47 所示,从 Xilinx 模块集选择相应模块添加到设计中。 3. 设置 coef_counter 模块的参数如下,保留其余的参数原有数值。 ? Number of Bits: 8 ? Arithmetic Type: Unsigned ? Initial Value: 92 ? Count To Value: 183 4. 设置 data_counter 模块的参数如下,保留其余的参数原有数值。 ? Number of Bits: 7 ? Arithmetic Type: Unsigned ? Initial Value: 0

38

? Count To Value: 91 ? Provide Enable Port: checked 5.添加控制逻辑,将驱动 data_counter 的 en 端口以产生以下的数据地址序列: 0 1 2 3 … 90 91 91 0 1 2 3 ...89 90 90 91 0 1 2 3 …89 89 90 91 en 6. 添加必须的逻辑,以产生具有以下特性的 we 特性。 we: coef_addr: 92 93 182 183

92 93 94…182 183 92 93 …182 183

92 93 94 95 …

图 7-47

控制系统

7. 仿真设计的模型,校验其具有如图 7-48 所示的输出结果。

图 7-48

控制系统的仿真结果

39

8. 除 System Generator 和 Resource Estimator 图标之外,产生 counter_enabled.mdl 控制逻辑的子系统。 注意: 可以选择控制逻辑 (不选择 Gateway Out 和 scope), 并按 Ctrl-G 来产生子系统。 9. 修改页链接的名称为相应的名称 (例如: coef_addr, data_addr, we) 10. 参数化由 counters 和 constant 组成的控制逻辑 Parameterize the control logic consisting of both 现在设置 Sample Period 为 Ts , ( 因为只对仿真控制逻辑感兴趣) 。 控制逻辑将连接到双口存储器,注意每个端口的宽度由它各自的输入宽度确定,这 些端口只可以有相互的宽度是 2、4、8、16 或 32 倍更大的差别。 提示:以下的 MATLAB 函数可以利用在模块参数化,使得设计更灵活。 length(X) – returns length of the array X log2(Y) – returns log of integer Y to the base of 2 ceil(N) – returns the smallest integer greater than or equal to the real number N 问题 2:写下应该输入的数据计数器 data_counter 模块的表达式: Number of Bits: Count to Value: 问题 3:写下应该输入的系数计数器 coef_counter 模块的表达式: Number of Bits: Initial Value: Count to Value: Sample Period: 问题 4:写下应该输入的常数 constant 模块的表达式: Constant Value: Number of Bits: 11. 添加 scope 到 Gateway Out。 12. 在 Simulation Parameter 中设置 Stop Time 为 200。 13. 在 workspace 中设置 Ts to 1 ,并仿真校验控制逻辑仍能正确地工作。 仿真输出应该仍有图 7-48 的结果。 三 添加双口 RAM

下一步添加双口 RAM 到设计中,用控制逻辑模块和必要的附加逻辑对 RAM 写入, 使它有混合模式的功能,数据从口 A 写入和读出——RAM 模式,系数只从口 B 读出—— ROM 模式。所以添加 constant (value = 0) 到口 B 的数据输入。仿真这部分设计,观察是 否从两个口得到所期望的输出。

40

1. 从 System Generator 模块集的 Memory 模块添加 dual-port RAM 元件。 2. 添加数值为 0 的 Boolean 常数到 port B 的 we 输入 端。 3. 添加数值为 0 (Number of bits = 12 bits and binary point position = 12)的 signed 常 数到 to input of port B 的 data 输入端。 4. 连接所有其他的 RAM 输入端口到控制子系统的输出。 5. 在双口 RAM 模块的参数中设置 Initial Value Vector 为期望的内容。 提示:以下有用的 MATLAB 函数的例子可能有助于执行这个任务。 Zeros(1,N) – returns an N element array of zeros [x y] – returns an array that is x- concatenated to y x’ – returns the array x in a transposed form >> x = [1 2 3 4] x=1234 >> x = x’ x= 1 2 3 4 问题 5:写下应该输入的双口 RAM 参数的表达式: Depth: Initial Value Vector: 6. 在双口 RAM 模块参数中对口 A 和口 B 设置 write mode 为 Read After Write。 7. 添加 Gateway Out 到双口 RAM 的口 A 和口 B。 8. 为测试的目的添加数值为 0 (Number of bits = 12 bits 和 binary point position = 12) signed 常数到 port A 的 data 输入端。or testing purpose 注意:应该有如图 33 所示连线到这个输入端的设计模型。

图 7-49

连接到双口 RAM 的控制逻辑

9. 在 Simulation Parameters 中设置 stop time 为 100,并仿真此设计。 此仿真结果应该如图 7-50 所示。

41

图 7-50

双口 RAM 和控制逻辑的仿真

四 在数据端口添加填充位和去填充位 注意: 每个端口宽度是由其各自的输入宽度决定的, 这些端口只可以有相互的宽度比 2、 4、8、16 或 32 倍更大的差别。当所预期的宽度不符合这个规则时,他们将必须是相同的。 所以必须操纵 RAM 前后的数据,在输入端,把 8 位的输入数据填充到 12 位来匹配端口的 宽度,输出端可以利用去填充位重新调整为原始的 8 位,这个概念在图 7-51 中说明。
0
A FIX_12_12 FIX_8_6

DIN A FIX_8_6 FIX_12_12

N-1

DIN B FIX_12_12

N ROM
B FIX_12_12

2N-1

图 7-51

利用不同的 RAM 端口宽度

单独利用 Simulink 的 Constant 源和 Display 沉等目标和必要 Xilinx 模块集,设 计格式化 FIX_8_6 数据输入为 FIX_12_11 的填充位逻辑。利用 0.2656 作为输入常数

42

值产生 0.008301 作为输出,校验这个逻辑的工作。 一旦被验证,移去源、沉和不必 要的目标,产生其余填充位逻辑的子系统,称它 Pad, 并把它放到双口 RAM 口 A 的 输入通道中。 1. 从 Simulink 库添加 Constant 源目标到设计中。 2. 从 Simulink 库添加 Display 沉目标到设计中。 3. 添加 Gateway In 和 Gateway Out 到设计中,设置 Gateway In 为带 rounding 的 FIX_8_6 输出。 4. 在刚添加的 Gateway In 和 Gateway Out 之间添加必要的 Xilinx 模块,执行填 充位的功能。 问题 6: 为使 FIX_8_6 变换为 UFIX_8_0, 然后变为 UFIX_12_0, 最后变为 FIX_12_12, 需要哪些模块? Block(s) needed to convert to UFIX_8_0: Block(s) needed to convert to UFIX_12_0: Block(s) needed to convert to FIX_12_12: 5. 分配常数 constant 的输入值为 0.2656 6. 运行仿真。 7. display 应该指示被变换的数值为 0.008301 8. 一旦被验证,产生一个填充位逻辑的子系统,并命名这个模块为 Pad。 注意:如果不能得到这个结果,在答案一节有其解。(Figure 18-19) 9. 移去双口 RAM 口 A 的常数 constant 输入。 10. 连接 delay 模块的输出到 Pad 子系统的输入, Pad 子系统的输出到双口 RAM 口 A 的输入端。 单独利用 Simulink 的 Constant 源和 Display 沉等目标和必要 Xilinx 模块集,设 计格式化 FIX_12_11 数据输入为 FIX_8_6 的去填充位逻辑。利用 0.008301 作为输入 常数值产生 0.2656 作为输出,校验这个逻辑的工作。 一旦被验证,移去源、沉和不 必要的目标,产生其余去填充位逻辑的子系统,称它 UnPad, 并把它放到双口 RAM 口 A 的输出通道中。 1. 从 Simulink 库添加 Constant 源目标到设计中。(如果必要) 2. 从 Simulink 库添加 Display 沉目标到设计中。(如果必要)

43

3. 添加 Gateway In 和 Gateway Out 到设计中 . (如果必要) 确认 Gateway In 有 , Rounding 的 Quantization set 和 FIX_12_11 的数据类型。 4. 在刚添加的 Gateway In 和 Gateway Out 之间添加必要的 Xilinx 模块,执行去 填充位的功能。 问题 7:为使 FIX_12_12 变换为 UFIX_8_0 ,然后变为 FIX_8_6 需要哪些模块? Block(s) needed to convert to UFIX_8_0: Block(s) needed to convert to FIX_8_6: 5. 分配常数 constant 的输入值为 0. 008301 6. 运行仿真。 7. display 应该指示被变换的数值为 0. 2656 8. 一旦被验证,产生一个去填充位逻辑的子系统,并命名这个模块为 UnPad。 注意:如果不能得到这个结果,在答案一节有其解。(Figure 18-20) 9. 放置 Unpad 子系统到双口 RAM 口 A 的输出通道中。 从设计图纸移去不必要的模块,选择 Step 源,设置仿真运行时间为 100,运行仿 真,并验证输出结果如图 36 所示。

图 7-52

当 Step 源加入时双口 RAM 的输出

1. 连接 Gateway Out 和 scope 到输出端。(如果必要) 。 2. 把 delay 元件的数据输出连接到填充位逻辑的输入端。 。 3. 双击 Switch1 选择 Step 源。 4. 在 Simulation Parameters 中,设置 Stop Time 为 100 。 5. 运行仿真,并观察输出结果。 注意:仿真结果应该如图 7-52 所示。

44

五 完成设计 在输入和填充位逻辑之间添加 up-sample 元件,设置 up-sample 的速率为 length (coef)。仿真此设计,并校验直到这一点的工作。 1. 在数据输入和填充位逻辑之间添加 up-sample 元件。 注意: 虽然这个 FIR 滤波器是一个单速率的系统 (sample rate out = sample rate in) , 由于 MAC FIR 的串行特性,内部速率要快得多,事实上是快 N(系数的数目)倍。 知道输入到 System Generator 模块的每个输入必须有相同的采样周期,因此 “up sampling” 必须出现在到 MAC FIR 的数据输入端。 2. 双击这个模块, 设置 Sampling Rate 为 length(coef)。 Copy Samples 选项的 在 框内点击,选择此选项。 3. 在输出端添加 Gateway Out,并添加 scope (if necessary)。 4. 在 simulation parameter 中,设置仿真的 Stop time 为 3。 5. 双击 Switch1 选择 Impulse 输入源。 6. 修改控制子系统的 coef_counter 采样周期匹配双口 RAM 口 A 的上采样数据输 入的采样速率。 注意: 如果没有匹配口 A 和口 B 的采样速率, System Generator 将报告如图 7-53 则 所示的错误。

图 7-53

System Generator 对不匹配采样率的错误报告

问题 8: 对采样周期的表达式应该是什么? 7. 对数据地址计数器和系数地址计数器的采样率重新设置,并相应更新 System Generator 模块的 Simulink System Period(sec)的数值。 完成以上的修改后,运行仿真,校验通过数据缓冲器的脉冲周期和全部系数,如图 7-55 所示的结果。

45

图 7-55

由双口 RAM 的脉冲输出和系数输出

8. 添加乘法累加单元 如果需要,先删除 Gateway Out 和 scope。 。 在去填充位逻辑的输出端添加 multiplier 和 accumulator (from lab3)。 设置乘法器 和累加器的模块参数匹配设计的技术条件,仿真此设计,并校验直到这一点的工作。
1. 选择 File

New Model,在新建图纸中从 Xilinx Blockset’s Math 库加入 multiplier、accumulator 和 register 模块,建立 12x8 MAC 子系统,其中 Multiplier 的参数: Precision Full Latency 3 Multiplier type Parallel Use Embedded Multipliers uncheck Pipeline to Greatest Extent Possible : check Use Dedicated Virtex-II Multiplier uncheck accumulator 的参数: Number of output bits 27 Overflow wrap Feedback scaling 1 Provide Reset Port checked Reinitialize with Input ‘b’ on Reset checked register 的参数: Initial value 0

46

Reinitialize with Input ‘b’ on Reset 2.

checked

添加必要的逻辑连接累加器 accumulator 的 reset 输入和寄存器的 CE 输入。

问题 9: 控制逻辑模块的哪个信号应该连接到累加器的复位和寄存器的时钟使能?

问题 10: 为什么?要求任何额外的逻辑吗?

3. 产生一个乘法器、累加器和寄存器模块的子系统,命名它为 MAC。 在寄存器的输出端添加 down-sample 模块,对高性能设计由 delay 元件随后。仿真此 设计,并校验它对输入脉冲的工作。保存输出到工作空间,并确认全部系数被获得。 1. 在寄存器的输出端添加 down-sample 模块。 2. 设置下采样率 down sampling rate 为 length(coef) (系数的长度)。 3. 添加 delay 元件使得输出定时,因此提供高性能设计。 4. 在仿真参数中设置仿真 Stop time 为 100。 5. 运行仿真,校验通过数据缓冲器的脉冲周期,全部系数如图 7-56 所示输出。

图 7-56

设计的脉冲输出

6. 添加 To Workspace 元件到设计的输出。

47

7. 修改 To Workspace 元件的 Save format 的特性为 Array。 8. 再一次仿真此设计。 9. 在 MATLAB 指令窗口中进入 workspace ,双击 simout 变量,滚动地通过全 部输出确认全部系数被获得。 注意:在数组的开始和数组的末尾可能看到少数 0 值,但是在这些 0 值之间全部 系数应该存在。

图 7-57

simout 的输出

六 用各种信源测试设计 添加 spectrum scope and MUX,连接输入信源到 MUX 的一个通道, 设计的输出 到 MUX 的另一个输入。选择 White Noise 信源,在 MATLAB 工作空间设置 Ts 和仿 真停止时间为适当数值后仿真此设计, Verify that the design works for the White Noise 对 输入信源校验此设计的工作,观察输出采样,验证期望的输出。 1. 2. 3. 4. 由 DSP Blockset DSP Sinks 添加 Spectrum Scope。 由 Simulink Signal Routing 模块集添加 MUX 。 连线输入到 MUX 的顶部通道,设计输出到 MUX 的底部通道。 双击 Spectrum Scope 元件,设置以下的特性: Scope 特性 ? ? ? ? ? Buffer input: checked Buffer size: 256 Buffer overlap: 32 Specify FFT length: unchecked Number of spectral averages: 10

Display 特性

48

? ? ? ?

Show display properties: checked Frame number: checked Channel legend: checked Open scope at start of simulation: checked

Axis 特性 ? ? ? ? ? ? ? Frequency units: Hertz Frequency range: [0…Fs/2] Inherit sample increment from input: unchecked Amplitude scaling: dB Minimum Y-limit: -54 Maximum Y-limit: 10 Y-axis title: Magnitude, dB

Line 特性 ? Line colors: [1 0 0] 5. 双击输入 Switch 选择 White Noise 信源。 6. 在 Simulation Parameters 中设置 Stop time 为 500/1500000。 7. 在 MATLAB 工作空间设置 Ts 为 1/1500000。 8. 双击 System Generator 模块。 9. 设置 Simulink System Period (sec) 为 Ts/length(coef)。 10. 运行仿真,校验输出。如图 7-61 和图 7-62 所示的结果。 选择 Impulse source ,仿真此设计,对脉冲输入信源校验设计的工作,观察输出 采样,校验期望的结果。 1. 双击输入 Switch 选择 Switch1 输入。 2. 双击 Switch1 选择 Impulse 输入。 3. 运行仿真,校验输出。如图 7-63 和图 7-64 所示。 选择 Step source,仿真此设计,对跳变输入信源校验设计的工作,观察输出采样, 校验期望的结果。 1. 双击 Switch1 选择 Step 输入。 2. 运行仿真,校验输出。如图 7-65 和图 7-66 所示。 七 实现设计

选择 multiplier 模块为利用 LUT,利用带以下硬件信息的 System Generator 模 块产生 VHDL 代码,实现此设计。 ? ? ? ? Product Family: Spartan3 Device: xc3s200 Speed: 4 Package: ft256

49

Synthesis Tool: XST Create Testbench: Unchecked Simulink System Period: Ts/length(coef) FPGA System Clock Period (ns): 20 1. 双击 multiplier 模块,不选择 Use Embedded Multipliers(uncheck)。 ( ) 2. 双击 System Generator 图标。 浏览到当前目录(d:/DSP_E/lab8/ise)作为目标目录。 设置 device 有关的区域为: ? Product Family: Spartan3 ? Device: xc3s200 ? Speed: 4 ? Package: ft256 ? Synthesis Tool: XST 3. 不选择 Create Testbench 选项。 4. 对 FPGA System Clock Period (ns) 输入 20。 5. Enter 对 Simulink System Period (ns) 输入 Ts/length(coef) ,并点击 Apply。 6. 点击 Generate。 7. 从当前目录(d:/DSP/lab8/ise)打开 mac_bandpass_clk_wrapper.npl ,并实现 此设计。 问题 11:利用布局和布线报告,列出资源利用率在下面 Number of Slices: Number of block RAM: 问题 12:利用布局和布线后时序报告,列出最大时钟频率 8. 关闭 Project Navigator 窗口。 选择 multiplier 模块利用 Embedded Multiplier,利用 System Generator 对此设计 重新产生 VHDL 代码,并重新实现此设计。(对 Sparten III 的演示板选作) 1. 双击 multiplier 模块,并选择 Use Dedicated Virtex-II Multipliers(check)。 ( ) 2. 点击 Generate 按钮。 3. 从当前目录(d:/DSP_E/lab8/ise)打开 mac_bandpass_clk_wrapper.npl ,并实 现此设计。 问题 13:利用布局和布线报告,列出资源利用率在下面 Number of Slices: Number of block RAM: Number of MULT18x18: 问题 14:利用布局和布线后时序报告,列出最大时钟频率 4. 关闭 Project Navigator 窗口。

? ? ? ?

50

八 执行硬件在环路校验 利用 System Generator 图标,产生硬件,通过硬件板校验此设计,通过 Simulink 仿真此设计。. 1. 保存设计模型为 mac_bandpass_hw.mdl。 。 2. 检查 Use Dedicated Virtex-II Multiplier 在 MAC 子系统中没有选择。 3. 双击 System Generator 图标,选择以下的参数: ? Compilation: Digilent3S ? Synthesis Tool: XST ? Target Directory:D:/ dsp_E/lab8/sp2e ? Create Testbench: Unchecked ? Simulink System Period (sec): Ts/length(coef) 注意:确认 System Generator 模块的窗口指示 Spartan3 xc3s200-4ft256 作为器件。 4. 点击 Generate 按钮,显示如图 7-58 所示的编译过程的进展。

图 7-58

在指令窗口编译的进展

5. 当生成成功地完成时,一个新的 Simulink 库窗口将弹出,显示一个带有相应数 量输入和输出的编译模块,如图 7-59 所示。

图 7-59

在新的 Simulink 窗口打开的编译模块

6. 拷贝编译模块到设计模型中,如图 7-60 所示连接它。 连接演示板,接通电源,选择 White Noise 信源,运行仿真,观察输出,检查结 果如图 7-61 和图 7-62 所示。

51

图 7-60

准备硬件在环路仿真的完全设计模型

1. 连接硬件的演示板,接通电源 2. 选择 White Noise 信源。 3. 运行仿真。 注意: 仿真结果应该如同图 7-61 和图 7-62 所示的形状, 观察硬 件演示板输出的类似结果,与 system generator 模块的结果比较。

图 7-61

在频谱屏幕上 Sysgen 和硬件的输出

图 7-62

在显示屏幕上 Sysgen 和硬件的输出

52

4. 选择 Impulse 信源时,运行仿真的结果以图 7-63 和图 7-64。

图 7-63

信源为 Impulse 的频谱仿真结果

图 7-64

信源为 step 的波形仿真结果

5. 选择 step 信源时,运行仿真的结果以图 7-65 和图 7-66。

图 7-65

信源为 step 的频谱仿真结果

53

图 7-66

信源为 step 的波形仿真结果

6. 保存设计模型,关闭 MATLAB。 问 题 答 案 1. The specification requires 12-bit data for the coefficients. What is the optimum format for the 12-bit coefficients to be in? FIX_12_12 2. Write down the expressions for the data_counter block that you would enter for: Number of Bits: ceil(log2(2*length(coef))) Count to Value: length(coef)-1 3. Write down the expressions for the coef_counter block that you would enter for: Number of Bits: ceil(log2(2*length(coef))) Initial Value: length(coef) Count to Value: 2*length(coef)-1 Sample Period: Ts 4. Write down the expressions for the constant block that you would enter for: Constant Value: 2*length(coef)-1 Number of Bits: ceil(log2(2*length(coef))) 5. Write down the expressions for the dual-port RAM that you would enter for: Depth: 2*length(coef) Initial Value Vector: [zeros(1,length(coef)) coef’] 6. Which blocks will be necessary to convert FIX_8_6 to UFIX_8_0, then to UFIX_12_0, and finally to FIX_12_12? Block(s) needed to convert to UFIX_8_0: Reinterpret Block(s) needed to convert to UFIX_12_0: Constant and Concat Block(s) needed to convert to FIX_12_12: Reinterpret

54

图 7-63.

Padding Design.

7. Which blocks will be necessary to convert FIX_12_12 to UFIX_8_0 and then to FIX_8_6? Block(s) needed to convert to UFIX_8_0: Slice Block(s) needed to convert to FIX_8_6: Reinterpret

图 7-64

. Un-padding Design.

What should be expression for the sample period? Ts/length(coef) 9. Which signal from the control logic block should be connected up to the reset of the accumulator and the CE of the capture register? WE 10. Why? Is any extra logic required? Because the multiplier has latency of 3 and the dual-port read is also synchronous, it is necessary to delay the we signal by four clock cycles. Use delay element and assign latency of 4 11. Using the place and route report, note the resource utilization below Number of Slices: 126 Number of block RAM: 1 12. Using the Post-Place and Route Timing report, note the maximum clock frequency below ~207 MHz 13. Using the place and route report, note the resource utilization below Number of Slices: 90 Number of block RAM: 1 Number of MULT18x18: 1 14. Using the Post-Place and Route Timing report, note the maximum clock frequency below ~200 MHz

8.

55


相关文章:
FPGA概述
FPGA 概述 FPGA(Field Programmable Gate Array)现场可编程逻辑门阵列,它是在PAL, GAL,CPLD等可编程器件的基础上进一步发展的产物.它是作为专用集成电路 (ASIC) ...
FPGA学习必看
FPGA 设计基本原则,设计思想,结构 1、硬件设计基本原则 (1)、速度与面积平衡和互换原则:一个设计如果时序余量较大,所能跑的频率远高于设计要求, 能可以通过模块...
FPGA研发牛人心得总结
FPGA研发牛人心得总结_学习总结_总结/汇报_实用文档 暂无评价|0人阅读|0次下载|举报文档FPGA研发牛人心得总结_学习总结_总结/汇报_实用文档。FPGA 研发之道 FPGA ...
学习FPGA绝佳网站推荐
可编程逻辑器件 - Programable Logic Device 一个专门的关于可编程逻辑器件 - Programable Logic Device ( FPGA & CPLD )的网站,里面的资料比较全。里面有几个...
FPGA初学者必读
FPGA初学者必读_信息与通信_工程科技_专业资料。FPGA初学者的极好教材!FPGA 学习的一些误区 作者:某人(摘自网络,不知道作者) 我常年担任多个有关 FPGA 学习研讨...
FPGA名词概念
FPGA名词概念_电子/电路_工程科技_专业资料。FPGA名词概念FPGA 名词概念 1、ASIC:application-specific integrated circuits 专用集成电路 是指应特定用户要求和特定电子...
FPGA不能下载
FPGA不能下载_信息与通信_工程科技_专业资料。关于 Altera 器件不能下载的问题总结!请大家补充!(转) 器件不能下载的问题总结! 请大家补充! 笔者前一段时间在调试...
为什么不推荐为了找工作而学习FPGA
为什么不推荐为了找工作而学习FPGA_信息与通信_工程科技_专业资料。去老莫的博客 << 返回上一页 上一篇 下一篇 ? ? ? 为什么不推荐为了找工作而学习 FPGA 2014...
牛人学fpga的过程)
牛人学习 FPGA 的过程回想起自己学 FPGA, 已经有一段时间了,从开始的茫然,到后来的疯狂看书,设计开发板, 调电路,练习各种 FPGA 实例,到最后能独立完成项目,一...
FPGA经验记录
9, FPGA 设计中的约束文件有 3 类:用户设计文件(.UCF 文件) 、网表约束文件(.NCF 文件)以及物理约束文件(.PCF 文件) ,可以完成时序约束、管脚约束以及区域...
更多相关标签:
fpga是什么 | fpga开发板 | 郭天祥 | fpga工程师 | fpga论坛 | 深入浅出玩转fpga | altera | fpga芯片 |