2022年verilog内存建模 .pdf

上传人:Che****ry 文档编号:27268220 上传时间:2022-07-23 格式:PDF 页数:15 大小:294.89KB
返回 下载 相关 举报
2022年verilog内存建模 .pdf_第1页
第1页 / 共15页
2022年verilog内存建模 .pdf_第2页
第2页 / 共15页
点击查看更多>>
资源描述

《2022年verilog内存建模 .pdf》由会员分享,可在线阅读,更多相关《2022年verilog内存建模 .pdf(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Verilog中的内存建模收藏这里的内存模型指的是内存的行为模型。Verilog中提供了两维数组来帮助我们建立内存的行为模型。具体来说,就是可以将内存宣称为一个reg 类型的数组,这个数组中的任何一个单元都可以通过一个下标去访问。这样的数组的定义方式如下:reg wordsize : 0 array_name 0 : arraysize;例如:reg 7:0 my_memory 0:255;其中 7:0 是内存的宽度,而0:255则是内存的深度(也就是有多少存储单元),其中宽度为 8位,深度为 256 。地址 0 对应着数组中的 0存储单元。如果要存储一个值到某个单元中去,可以这样做:my_m

2、emory address = data_in;而如果要从某个单元读出值,可以这么做:data_out = my_memory address;但要是只需要读一位或者多个位,就要麻烦一点,因为Verilog不允许读 /写一个位。这时,就需要使用一个变量转换一下:例如:data_out = my_memoryaddress;data_out_it_0 = data_out0;这里首先从一个单元里面读出数据,然后再取出读出的数据的某一位的值。初始化内存初始化内存有多种方式,这里介绍的是使用$readmemb 和 $readmemh系统任务来将保存在文件中的数据填充到内存单元中去。$readmemb

3、 和 $readmemh是类似的,只不过$readmemb用于内存的二进制表示,而$readmemh则用于内存内容的16 进制表示。这里以 $readmemh系统任务来介绍。语法$readmemh(file_name, mem_array, start_addr, stop_addr);注意的是:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 15 页 - - - - - - - - - file_name是包含 数据 的文本 文件 名,mem_array是要初 始化 的

4、内 存单 元数 组名,start_addr 和 stop_addr是可选的,指示要初始化单元的起始地址和结束地址。下面是一个简单的例子:module memory ();reg 7:0 my_memory 0:255;initial begin$readmemh(memory.list, my_memory);endendmodule这里使用内存文件memory.list来初始化 my_memory数组。而下面就是一个内存文件的例子。/ Comments are allowedCC / This is first address i.e 8h00AA / This is second addr

5、ess i.e 8h0155 / Jump to new address 8h555A / This is address 8h5569 / This is address 8h56对于内存文件,要注意的是下列几点:(1)注释标记 /在内存文件中是被允许的;(2)使用 符号将跳到新的目标地址,没有符号就表示地址将顺序递增。关于这个系统任务,有下列常见的用法:(1 )顺序初始化所有的数组单元;这种情况下,可以使用符号来指示地址,也可以不使用它,而只在每一行存放要存放的数据。这样数据将顺序按地址递增存放,从0 地址开始。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - -

6、- - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 15 页 - - - - - - - - - (2 )只初始化部分的数组单元;这种情况下,可以使用符号来指示下一个要初始化的地址,然后对该地址单元进行初始化。例如下列的内存文件就只初始化8h00,8h01,8h55 和8h564个内存地址单元。/ Comments are allowedCC / This is first address i.e 8h00AA / This is second address i.e 8h0155 / Jump to new address 8h555A / This

7、 is address 8h5569 / This is address 8h56(3 )只初始化数组的地址区间的一部分单元。这个时候,还可以使用$readmemh任务的 start_addr 和 stop_addr选项来指定初始化的范围。例如,只初始化 100 到104 这5 个单元,就可以这么做:内存文件 memory.list定义为:CCAA555A69而$readm emh(memory.list, my_memory, 100 , 104); 就指定使用memory.list来初始化 my_memory的100-104单元。名师资料总结 - - -精品资料欢迎下载 - - - - -

8、 - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 15 页 - - - - - - - - - 用 memory generation tool 产生的时候有文件名吧,还有生成了些端口。在你的模块中实例化那个文件就可以了。比如你生成了文件名是mem 你调用的时候写mem mem0 (clk(),.rst(),.addra(),.addrb(),.da(),.db(),.qa(),.qb(),.,); 填上各个端口号就行了。寄存器的初始化。你定义了些寄存器,那你在用寄存器的时候多半是在always 里面,那复位的时候就可以付初值alw

9、ays(posedge clk or negedge rst) if (rst) reg=0 else if () reg=. 像这样就可以初始化了。当然还有其他方法,多看书多编程就好了名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 15 页 - - - - - - - - - timescale 1ns/100ps module readmem_tb; reg 7:0 Mem0:h7ff; initial begin $readmemh (frame.mif,Mem);

10、 end Endmodule 000/* * 1s frame data */ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 00 00 00 00 00 00 00 00 00 00 00 0030 31 32 33 00 00 00 00 00 00 00 00 00 00 00 0040 41 42 43 00 00 00 00 00 00 00 00 00 00 00 0050 51 52 53 00 00 00 00

11、 00 00 00 00 00 00 00 0060 61 62 63 00 00 00 00 00 00 00 00 00 00 00 0070 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 11 11 11 11 11 11 11 11 11 11 11 11A0 A1 A2 A3 11 11 11 11 11 11 11 11 11 11 11 11B0 B1 B2 B3 11 11 11 11 11 11 11 11 11

12、11 11 11C0 C1 C2 C3 11 11 11 11 11 11 11 11 11 11 11 11D0 D1 D2 D3 11 11 11 11 11 11 11 11 11 11 11 11E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF 100/* * 2d frame data */ 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19

13、 1A 1B 1C 1D 1E 1F 20 21 22 23 22 22 22 22 22 22 22 22 22 22 22 2230 31 32 33 22 22 22 22 22 22 22 22 22 22 22 2240 41 42 43 22 22 22 22 22 22 22 22 22 22 22 2250 51 52 53 22 22 22 22 22 22 22 22 22 22 22 2260 61 62 63 22 22 22 22 22 22 22 22 22 22 22 2270 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7

14、F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 33 33 33 33 33 33 33 33 33 33 33 33名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 15 页 - - - - - - - - - A0 A1 A2 A3 33 33 33 33 33 33 33 33 33 33 33 33B0 B1 B2 B3 33 33 33 33 33 33 33 33 33 33 33 33

15、C0 C1 C2 C3 33 33 33 33 33 33 33 33 33 33 33 33D0 D1 D2 D3 33 33 33 33 33 33 33 33 33 33 33 33E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 15 页 - - - - - - - - - F

16、FT 算法的一种FPGA 实现 2006-12-2 11:11:00 | By: skycanny 0 推荐1引言OFDM (正交频分复用)是一种多载波数字调制技术,被公认为是一种实现高速双向无线数据通信的良好方法。在OFDM 系统中,各子载波上数据的调制和解调是采用FFT(快速傅里叶变换)算法来实现的。因此在OFDM 系统中, FFT 的实现方案是一个关键因素。其运算精度和速度必须能够达到系统指标。对于一个有512个子载波,子载波带宽20 kHz 的 OFDM 系统中,要求在50 s 内完成 512点的 FFT 运算。硬件实现FFT 算法的主要方案有:DSP (通用数字信号处理器);FFT

17、专用芯片; FPGA (现场可编程门阵列) 。DSP具有纯软件实现的灵活性,适合用于流程复杂的算法,例如在通信系统中的信道编、解码, QAM 映射等算法。如果在DSP中完成 FFT 运算,不仅要占用大量D SP的运算时间,使整个系统的数据吞吐率降低,也无法发挥DSP软件实现的灵活性。因此,前端的FFT 运算应由ASIC 或 FPGA完成。采用专用的FFT 处理芯片,虽然速度能达到要求,但其可扩展性差。FPGA具有硬件结构可重构的特点。适合于算法结构固定、运算量大的前端数字信号处理。新近推出的FPGA产品都采用多层布线结构,更低的核心电压, 更丰富的 IO 管脚, 容量可达到100 k 个逻辑单

18、元(LES) ,内置嵌入式RAM资源,内部集成多个数字锁相环,多个嵌入的硬件乘法器,所有这一切都使得FPGA在数字信号处理领域显示出自己特有的优势。本设计根据OFDM 系统的实际需要,提出一种用FPGA实现 FFT 运算的方案, 并以 64点 FFT 为例,在 Quartus II软件上通过了综合和仿真。2方案分析FFT 是 DFT (离散傅里叶变换)的快速算法。以图1为例, N点 FFT 共需要 log2N级运算,每级需要 N/2 个蝶型运算。因为系统中FFT 运算点数为2的奇数次方,因此本设计采用的是按时间抽取的基二 FFT 运算。FPGA实现 FFT 需考虑的问题有:(1) 整体实现结构

19、的设计。对 FFT 算法进行合理的模块划分,各个模块在中央控制单元的管理下并行工作,实现框图如图2所示。(2) 数据格式和长度的选择通常的数据表示方法有3种:浮点,定点和块浮点。浮点数用2组固定的bit来表示指数和小数,动态范围大。只要表示指数的位数足够多,浮点运算就不会发生溢出现象。但是完成浮点运算所需要的电路复杂,运算速度慢。定点数小数点位置固定,用固定的bit来表示整数和小数部名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 15 页 - - - - - - - -

20、- 分。定点数动态范围小,容易溢出。但是其运算电路简单、速度快。块浮点介于浮点和定点之间。在 FFT 运算过程中,逐级进行溢出判断和移位选择,实现动态范围扩展。本方案采用块浮点运算。即小数点的位置随中间运算结果动态范围的增大而右移。入口基带数据为 10 b 补码格式。 FFT 运算结果输出2路10 b 。实部、虚部各一路,补码表示。由于入口数据精度的限制,旋转因子的实部、虚部取和输入数据同样的量化位数3 。(3) 地址生成单元的设计在 FFT 中,输入数据和旋转因子的寻址是设计中最灵活的部分。一种容易想到的实现方案是利用 RAM为每级蝶型运算生成地址查找表,蝶型运算序数作为查找表地址,读出的内

21、容为输入数据和旋转因子地址。优点是地址生成速度快,缺点是消耗大量的片上RAM资源。N 点 FFT 需要 log2N b表 示 地 址 。 N/2 个 旋 转 因 子 用log2(N/2) b表 示 地 址 。 每 级 地 址 查 找 表 都 需 要(Nlog2N+N/2 log(N/2) b。本文设计的一种地址生成逻辑,采用流水线结构,通过简单的移位和加法运算,延迟 4个时钟3实现技术整体设计分为数据接收部分和FFT 运算部分。数据接收部分工作在频率低的clk_data。其他逻辑工作在频率高的clk_fast。两个时钟通过双口的接收RAM进行衔接。3.1 数据接收单元数据接收单元将每帧数据按码

22、位倒置的顺序乒乓存入接收RAM1 或接收RAM2 。数据接收模块有2 b的标志信息通知给中心控制单元。中心控制单元根据标志位,交替的对接收RAM中的数据进行处理。 当中央控制单元将接收RAM中的数据取出,经过蝶型运算, 结果存入运算RAM1 的同时,上一帧数据的FFT 运算结果从运算RAM2 取出。为了实现乒乓操作,接收RAM共有 2块,用 FPGA的片上 RAM 实现,为Simple DualPort模式。读、写端口分别有自己独立的数据总线、地址总线和工作时钟。数据接收单元控制写端口,中心控制单元控制读端口。3.2 运算单元运算单元由蝶型运算器和运算RAM组成。蝶型运算器完成对输入数据A,B

23、的蝶型运算。设输从上两式可以看出共有2个乘累加项 (bpWp-bqWq) 和(bpWq+bqWp)。 蝶型运算的各个模块都利用QuartusII开发软件中所提供的宏单元生成。整个蝶型运算为同步逻辑,共需要4个时钟周期。输入数据 A,B 为10 b ,因此乘累加运算单元输出为20 b ,才能保证不溢出。乘累加运算单元输出结果,截断低 8位(蝶型运算因子低8位为小数) ,保留整数部分输入到加法器、减法器。同时为了使数据同步,数据通过寄存器组延迟3个时钟。同时符号扩展2位,与乘累加单元输出结果对齐。从以上描述和FFT 算法的分析2表明:每级FFT 运算结果的动态范围最多需要扩展2 b 。因此中间运算

24、结果的位宽应为24 b ,实部、虚部各12 b 。在进行下一级蝶型运算时,12 b 数据被取出。 按照块浮点单元记录的动态范围扩展bit数,完成定标。 截取其中的 10 b 送入蝶型运算器。运算 RAM1 和运算 RAM2 作为 FFT 的中间的数据缓存。两块 RAM交替作为数据读出和运算结果写入 单元。直到第 6级蝶型运算完成。运算RAM采用 True DualPort Memory模式。每一侧的端口均可在独立的工作时钟下完成随机地址数据的读或者写操作。即可以同时将蝶型运算所需要的两个入口数据读出,也可以同时将两个运算结果写入。比单口RAM减小了一半的读写周期。3.3 旋转因子查找表名师资料

25、总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 15 页 - - - - - - - - - 旋转因子查找表,存储FFT 运算所需要的旋转因子3.4 地址产生单元地址产生单元产生每一级蝶型运算所需的两个输入数据和旋转因子的地址。从图1可以看到,该 FFT 实现结构为原位运算。蝶型运算的结果仍然写回输入数据读出地址。因此需将读数据地址延迟若干时钟周期,作为运算结果写入地址。对于 N点 FFT运算,设 m (0log2N-1) , n(0N/2 -1) 表示第 m级的第 n 个蝶型运

26、算。 addr_A ,addr_B ,(addr_Ap fin 时,在 N 点内可完成FFT 运算。否则不能完成,即不能实现流型的变换。这在N 很大且输入数据速率较高时以FPGA 实现几乎是不可能的,而且内部计算时钟过高容易导致电路的工作不稳定。设基2时的最小可流型工作运算频率为fa0,则使用基 4实现流型的变换,计算时钟fa= fa0就可以。而使用基8时计算时钟fa= fa0 便可完成,基 16时为 fa0的1/4。上面所讨论的是纯基运算,当N 不为 4的幂次方时 (如 N=2048=16 16 8,运算模块为基 16/8复用模块 ),而又希望使用较低倍的时钟完成运算时,图2中的运算模块必然

27、包括基4/2复用模块 (即基 16/8复用模块 ),这也就是前面提到复用模块的主要用意。由上面的分析可以得出结论,如果计算使用的基越大,完成速度越快。但是,使用基 16/8模块所使用的逻辑资源要比基4/2模块多将近一倍,这是因为基16/8复用模块是以基4模块和基 4/2复用模块构建而成。当然,可以直接实现基16/8复用模块,但用FPGA 很难解决复杂度和成本问题。另外,如果流型运算间隔比N 点数据长度长一倍以上,可以考虑在较低的计算时钟下使用基2运算模块实现流型FFT。运算结果的精度直接与计算过程中数据和因子位数(浮点算法 )相关,如果中间计算的位数、存储数据位数和 Rom 表中的位数越大,输

28、出精度就越大。当然,位数增大后逻辑运算资源和存储资源都会直线上升。浮点、块浮点和定点FFT根据运算过程中对数据位数取位和表示形式的不同,可以将FFT 分为浮点 FFT、块浮点 FFT 和定点FFT。它们在实现时对于系统资源的要求是不同的,而且有着不同的适用范围。浮点 FFT 是基于数据表示为浮点的基础之上的,即数据是由一纯小数和一因子组成,输入要转成纯小数和因子的浮点表示形式,所有计算过程中保存应得计算结果大小,而输出要变成所需大小的定点表示形式。只要因子位数足够大,浮点FFT 计算是不会溢出的。而定点则是所有计算过程中都是定点运算,如果各个 Pass 的截位规则不适当,很容易出现溢出,必须要

29、有溢出控制。块浮点是介于它们之间的一种运算机制,它是根据本Pass 的输入数据的大小,在计算之前进行控制(数据上移一比特或下移一比特或乘以一特定因子 ),可以保证不溢出,但一般也需要溢出控制。浮点运算没有溢出,信号平均信噪比高,但由于因子的运算必然导致电路复杂,实现困难。定点运算实现简单,难以保证不溢出,需要统计得出合适的截位规则,否则溢出严重导致输出结果错误。块浮点由于每个 Pass(包括最后输出前)结束后有一统计控制过程,延时较大,但是可以保证不溢出而且电路又相对浮点来说简单得多。应根据具体应用的具体要求,选择合适的FFT 。如果要求精度,并且要解决频域很高的单频干扰,就名师资料总结 -

30、- -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 15 页 - - - - - - - - - 必须使用浮点的FFT,使用数据位数很大的定点和块浮点也能解决这个问题,但位数的确定十分困难。如果不要求高精度,逻辑资源和Rom 比较紧张,可考虑定点运算。如果输入在频域集中于几个点上或者对精度要求一般,可以慢速处理,可以采用块浮点运算,就能够保证这几点的信噪比,而忽略其他点处的信噪比。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 15 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁