版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Good is good, but better carries it.精益求精,善益求善。verilog内存建模-Verilog中的内存建模HYPERLINKJavaScript:d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(saveit=window.open(/storeit.aspx?t=+escape(d.title)+&u=+escape(d.location.href)+&c=+esc
2、ape(t),saveit,scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes);saveit.focus();收藏这里的内存模型指的是内存的行为模型。Verilog中提供了两维数组来帮助我们建立内存的行为模型。具体来说,就是可以将内存宣称为一个reg类型的数组,这个数组中的任何一个单元都可以通过一个下标去访问。这样的数组的定义方式如下:regwordsize:0array_name0:arraysize;例如:reg7:0my_memory0:255;其中7:0是内存的宽度,而0:255则是内存的
3、深度(也就是有多少存储单元),其中宽度为8位,深度为256。地址0对应着数组中的0存储单元。如果要存储一个值到某个单元中去,可以这样做:my_memoryaddress=data_in;而如果要从某个单元读出值,可以这么做:data_out=my_memoryaddress;但要是只需要读一位或者多个位,就要麻烦一点,因为Verilog不允许读/写一个位。这时,就需要使用一个变量转换一下:例如:data_out=my_memoryaddress;data_out_it_0=data_out0;这里首先从一个单元里面读出数据,然后再取出读出的数据的某一位的值。初始化内存初始化内存有多种方式,这里
4、介绍的是使用$readmemb和$readmemh系统任务来将保存在文件中的数据填充到内存单元中去。$readmemb和$readmemh是类似的,只不过$readmemb用于内存的二进制表示,而$readmemh则用于内存内容的16进制表示。这里以$readmemh系统任务来介绍。语法$readmemh(file_name,mem_array,start_addr,stop_addr);注意的是:file_name是包含数据的文本文件名,mem_array是要初始化的内存单元数组名,start_addr和stop_addr是可选的,指示要初始化单元的起始地址和结束地址。下面是一个简单的例子:
5、modulememory();reg7:0my_memory0:255;initialbegin$readmemh(memory.list,my_memory);endendmodule这里使用内存文件memory.list来初始化my_memory数组。而下面就是一个内存文件的例子。/CommentsareallowedCC/Thisisfirstaddressi.e8h00AA/Thisissecondaddressi.e8h0155/Jumptonewaddress8h555A/Thisisaddress8h5569/Thisisaddress8h56对于内存文件,要注意的是下列几点:(
6、1)注释标记/在内存文件中是被允许的;(2)使用符号将跳到新的目标地址,没有符号就表示地址将顺序递增。关于这个系统任务,有下列常见的用法:(1)顺序初始化所有的数组单元;这种情况下,可以使用符号来指示地址,也可以不使用它,而只在每一行存放要存放的数据。这样数据将顺序按地址递增存放,从0地址开始。(2)只初始化部分的数组单元;这种情况下,可以使用符号来指示下一个要初始化的地址,然后对该地址单元进行初始化。例如下列的内存文件就只初始化8h00,8h01,8h55和8h564个内存地址单元。/CommentsareallowedCC/Thisisfirstaddressi.e8h00AA/Thisi
7、ssecondaddressi.e8h0155/Jumptonewaddress8h555A/Thisisaddress8h5569/Thisisaddress8h56(3)只初始化数组的地址区间的一部分单元。这个时候,还可以使用$readmemh任务的start_addr和stop_addr选项来指定初始化的范围。例如,只初始化100到104这5个单元,就可以这么做:内存文件memory.list定义为:CCAA555A69而$readmemh(memory.list,my_memory,100,104);就指定使用memory.list来初始化my_memory的100-104单元。用me
8、morygenerationtool产生的时候有文件名吧,还有生成了些端口。在你的模块中实例化那个文件就可以了。比如你生成了文件名是mem你调用的时候写memmem0(clk(),.rst(),.addra(),.addrb(),.da(),.db(),.qa(),.qb(),.,);填上各个端口号就行了。寄存器的初始化。你定义了些寄存器,那你在用寄存器的时候多半是在always里面,那复位的时候就可以付初值always(posedgeclkornegedgerst)if(rst)reg=0elseif()reg=.像这样就可以初始化了。当然还有其他方法,多看书多编程就好了timescale1
9、ns/100psmodulereadmem_tb;reg7:0Mem0:h7ff;initialbegin$readmemh(frame.mif,Mem);endEndmodule000/*1sframedata*/000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223000000000000000000000000303132330000000000000000000000004041424300000000000000000000000050515253000000000000000000000000
10、60616263000000000000000000000000707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293111111111111111111111111A0A1A2A3111111111111111111111111B0B1B2B3111111111111111111111111C0C1C2C3111111111111111111111111D0D1D2D3111111111111111111111111E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5
11、F6F7F8F9FAFBFCFDFEFF100/*2dframedata*/000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222322222222222222222222222230313233222222222222222222222222404142432222222222222222222222225051525322222222222222222222222260616263222222222222222222222222707172737475767778797A7B7C7D7E7F808182
12、838485868788898A8B8C8D8E8F90919293333333333333333333333333A0A1A2A3333333333333333333333333B0B1B2B3333333333333333333333333C0C1C2C3333333333333333333333333D0D1D2D3333333333333333333333333E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFFFFT算法的一种FPGA实现2006-12-211:11:00|By:skycanny0HYPERL
13、INKjavascript:void(null)推荐1引言OFDM(正交频分复用)是一种多载波数字调制技术,被公认为是一种实现高速双向无线数据通信的良好方法。在OFDM系统中,各子载波上数据的调制和解调是采用FFT(快速傅里叶变换)算法来实现的。因此在OFDM系统中,FFT的实现方案是一个关键因素。其运算精度和速度必须能够达到系统指标。对于一个有512个子载波,子载波带宽20kHz的OFDM系统中,要求在50s内完成512点的FFT运算。硬件实现FFT算法的主要方案有:DSP(通用数字信号处理器);FFT专用芯片;FPGA(现场可编程门阵列)。DSP具有纯软件实现的灵活性,适合用于流程复杂的算
14、法,例如在通信系统中的信道编、解码,QAM映射等算法。如果在DSP中完成FFT运算,不仅要占用大量DSP的运算时间,使整个系统的数据吞吐率降低,也无法发挥DSP软件实现的灵活性。因此,前端的FFT运算应由ASIC或FPGA完成。采用专用的FFT处理芯片,虽然速度能达到要求,但其可扩展性差。FPGA具有硬件结构可重构的特点。适合于算法结构固定、运算量大的前端数字信号处理。新近推出的FPGA产品都采用多层布线结构,更低的核心电压,更丰富的IO管脚,容量可达到100k个逻辑单元(LES),内置嵌入式RAM资源,内部集成多个数字锁相环,多个嵌入的硬件乘法器,所有这一切都使得FPGA在数字信号处理领域显
15、示出自己特有的优势。本设计根据OFDM系统的实际需要,提出一种用FPGA实现FFT运算的方案,并以64点FFT为例,在QuartusII软件上通过了综合和仿真。2方案分析FFT是DFT(离散傅里叶变换)的快速算法。以图1为例,N点FFT共需要log2N级运算,每级需要N/2个蝶型运算。因为系统中FFT运算点数为2的奇数次方,因此本设计采用的是按时间抽取的基二FFT运算。FPGA实现FFT需考虑的问题有:(1)整体实现结构的设计。对FFT算法进行合理的模块划分,各个模块在中央控制单元的管理下并行工作,实现框图如图2所示。(2)数据格式和长度的选择通常的数据表示方法有3种:浮点,定点和块浮点。浮点
16、数用2组固定的bit来表示指数和小数,动态范围大。只要表示指数的位数足够多,浮点运算就不会发生溢出现象。但是完成浮点运算所需要的电路复杂,运算速度慢。定点数小数点位置固定,用固定的bit来表示整数和小数部分。定点数动态范围小,容易溢出。但是其运算电路简单、速度快。块浮点介于浮点和定点之间。在FFT运算过程中,逐级进行溢出判断和移位选择,实现动态范围扩展。本方案采用块浮点运算。即小数点的位置随中间运算结果动态范围的增大而右移。入口基带数据为10b补码格式。FFT运算结果输出2路10b。实部、虚部各一路,补码表示。由于入口数据精度的限制,旋转因子的实部、虚部取和输入数据同样的量化位数3。(3)地址
17、生成单元的设计在FFT中,输入数据和旋转因子的寻址是设计中最灵活的部分。一种容易想到的实现方案是利用RAM为每级蝶型运算生成地址查找表,蝶型运算序数作为查找表地址,读出的内容为输入数据和旋转因子地址。优点是地址生成速度快,缺点是消耗大量的片上RAM资源。N点FFT需要log2Nb表示地址。N/2个旋转因子用log2(N/2)b表示地址。每级地址查找表都需要(Nlog2N+N/2log(N/2)b。本文设计的一种地址生成逻辑,采用流水线结构,通过简单的移位和加法运算,延迟4个时钟得到数据地址,并对原理进行了详细的阐述。3实现技术整体设计分为数据接收部分和FFT运算部分。数据接收部分工作在频率低的
18、clk_data。其他逻辑工作在频率高的clk_fast。两个时钟通过双口的接收RAM进行衔接。3.1数据接收单元数据接收单元将每帧数据按码位倒置的顺序乒乓存入接收RAM1或接收RAM2。数据接收模块有2b的标志信息通知给中心控制单元。中心控制单元根据标志位,交替的对接收RAM中的数据进行处理。当中央控制单元将接收RAM中的数据取出,经过蝶型运算,结果存入运算RAM1的同时,上一帧数据的FFT运算结果从运算RAM2取出。为了实现乒乓操作,接收RAM共有2块,用FPGA的片上RAM实现,为SimpleDualPort模式。读、写端口分别有自己独立的数据总线、地址总线和工作时钟。数据接收单元控制写
19、端口,中心控制单元控制读端口。3.2运算单元运算单元由蝶型运算器和运算RAM组成。蝶型运算器完成对输入数据A,B的蝶型运算。设输从上两式可以看出共有2个乘累加项(bpWp-bqWq)和(bpWq+bqWp)。蝶型运算的各个模块都利用QuartusII开发软件中所提供的宏单元生成。整个蝶型运算为同步逻辑,共需要4个时钟周期。输入数据A,B为10b,因此乘累加运算单元输出为20b,才能保证不溢出。乘累加运算单元输出结果,截断低8位(蝶型运算因子低8位为小数),保留整数部分输入到加法器、减法器。同时为了使数据同步,数据通过寄存器组延迟3个时钟。同时符号扩展2位,与乘累加单元输出结果对齐。从以上描述和
20、FFT算法的分析2表明:每级FFT运算结果的动态范围最多需要扩展2b。因此中间运算结果的位宽应为24b,实部、虚部各12b。在进行下一级蝶型运算时,12b数据被取出。按照块浮点单元记录的动态范围扩展bit数,完成定标。截取其中的10b送入蝶型运算器。运算RAM1和运算RAM2作为FFT的中间的数据缓存。两块RAM交替作为数据读出和运算结果写入单元。直到第6级蝶型运算完成。运算RAM采用TrueDualPortMemory模式。每一侧的端口均可在独立的工作时钟下完成随机地址数据的读或者写操作。即可以同时将蝶型运算所需要的两个入口数据读出,也可以同时将两个运算结果写入。比单口RAM减小了一半的读写
21、周期。3.3旋转因子查找表旋转因子查找表,存储FFT运算所需要的旋转因子3.4地址产生单元地址产生单元产生每一级蝶型运算所需的两个输入数据和旋转因子的地址。从图1可以看到,该FFT实现结构为原位运算。蝶型运算的结果仍然写回输入数据读出地址。因此需将读数据地址延迟若干时钟周期,作为运算结果写入地址。对于N点FFT运算,设m(0log2N-1),n(0N/2-1)表示第m级的第n个蝶型运算。addr_A,addr_B,(addr_Apfin时,在N点内可完成FFT运算。否则不能完成,即不能实现流型的变换。这在N很大且输入数据速率较高时以FPGA实现几乎是不可能的,而且内部计算时钟过高容易导致电路的
22、工作不稳定。设基2时的最小可流型工作运算频率为fa0,则使用基4实现流型的变换,计算时钟fa=fa0就可以。而使用基8时计算时钟fa=fa0便可完成,基16时为fa0的1/4。上面所讨论的是纯基运算,当N不为4的幂次方时(如N=2048=16168,运算模块为基16/8复用模块),而又希望使用较低倍的时钟完成运算时,图2中的运算模块必然包括基4/2复用模块(即基16/8复用模块),这也就是前面提到复用模块的主要用意。由上面的分析可以得出结论,如果计算使用的基越大,完成速度越快。但是,使用基16/8模块所使用的逻辑资源要比基4/2模块多将近一倍,这是因为基16/8复用模块是以基4模块和基4/2复用模块构建而成。当然,可以直接实现基16/8复用模块,但用FPGA很难解决复杂度和成本问题。另外,如果流型运算间隔比N点数据长度长一倍以上,可以考虑在较低的计算时钟下使用基2运算模块实现流型FFT。运算结果的精度直接与计算过程中数据和因子位数(浮点算法)相关,如果
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国家用智能沙发供需前景预测与营销策略研究报告
- 【新教材】2025-2026学年苏少版(2024)初中美术七年级上册(全册)教学设计(教案)
- 房地产行业市场前景及投资研究报告:解构重塑地产股PB
- 下册举一反三专题特训专题101分式【十大题型】(原卷版+解析)x苏科版八年级数学
- 2025-2026学年黑龙江省鹤岗市高三最后一卷化学试卷(含答案解析)
- 某家电企业产品质量检验细则
- 航空母舰制造厂生产管理规范
- AI在农资营销与服务中的应用
- 某印刷厂质量控制条例
- 膨润土原矿买卖合同
- 2026年公立医院检验科招聘试题(附答案)
- 2026年自然资源统一确权登记知识测试题
- 2026江苏苏州资管集团下属公司招聘14人笔试历年参考题库附带答案详解
- 第10课 诚信贵如金 课件(内嵌视频)-2025-2026学年道德与法治二年级下册统编版
- 2026年二级注册计量师(计量法律法规及综合知识)考试试题及答案
- 《彩色的梦》公开课课件
- 湖北新八校2026年高三下4月联考高考二模化学试卷
- 2024-2025学年广东省深圳实验学校八年级(下)期中数学试卷及答案
- 2025年乡镇选拔副科试题及答案
- CB/T 3766-1996排气管钢法兰及垫片
- 余杭高级中学自主招生辅导试题
评论
0/150
提交评论