最近做一个项目,是基于FPGA去实现LZW压缩编码算法。我看了一篇论文是用状态机实现的。但由于我做的东西比较少,所以有些东西看不懂。现在我把文章的原文上传一下:LZW压缩算法的基本思想是建立一个字符串表,将输入字符串映射成定长的码字输出,通常码长设为12hit,本系统根据后面线路码编码的需要将码长设为10bit,输入数据流为sbit并行数据,因此,字符串表有1024个表项,其中256个用来存放已定义的字符,剩余的768个用来存放前缀。系统的LZW编码与解码利用FPGA
技术实现,使用verilog语言进行压缩程序设计,采用50MHz的高速时钟信号控制整个压缩过程Lzw编码的压缩模块中包括:字符串表,数据比较器,移位寄存器,添加字符串,和串表计数器。首先将FPGA初始化:设置一个大小为IO24x18的字符串表,串表的高10位存放字符串的前缀(P),低8为存放当前输入的码字(C),串表的前256项初始化为0~255,后768项初始化为0。当FPGA准备就绪后,在第一个时钟脉冲上升沿到来时,向FIFOI发出第一个读信号,则FIFOI输送第一个字节的待压缩数据到FPGA的查字符串表模块,经数据比较单元后,判断接收到的数据是否在存储器中,如果在,则把这个数据左移8位放在移位寄存器作为数据前缀,同时向FIFOI再发一个读信号,FIFOI向FPGA输送下一个字节的数据,FPGA将移位寄存器中的前缀与这个字节的数据相加后组成新的字符串,再判断这个新字符串是否在字符串表中,如果不在字符串表中,则将此新字符串添加到字符串表中,同时字符串表指针加1,然后将新字符串的前缀输出到FIFOZ存储器;如果在,则将字符串表中索引号作为前缀,继续接收下一个字节,如此循环,直至字符串表满。当字符串表满时,对字符串表进行初始化操作,重复一前面的操作。当输入数据流为空,即FIFOI向FPGA发出空信号时,表示待压缩数据己输送完毕即数据压缩结束。
Lzw编码的核心是压缩模块的实现,设计了一个状态机来实现LZw编码。将编码过程分为六个状态,分别是初始化状态、读第一个字符状态、读下一个字符状态、生成字符串状态、字符串比较状态和压缩数据输出状态。在初始化状态中将字符串表以及程序中定义的寄存器进行初始化操作,然后进入读第一字符状态;如果在该状态接收到的FIFOI的空信号有效时,则无数据读入,状态转移到初始化状态,空信号无效时则读入第一个字符串,并将该字符赋值给P(前缀码),然后状态转移到下一状态即读下一个字符状态;在读下一个字符状态,如果空信号有效,则状态在此状态循环,直到空信号有效,如果空信号有效,则读入一个字符到C(当前码),然后转移到下一状态;在生成字符串状态将前缀码P左移8位,然后同当前码C相加,得到需要比较的当前字符串后进入字符串比较状态;在字符串比较状态将P+C与串表中己定义的字符串进行比较,得到比较的结果(comp),并将状态转移到压缩数据输出状态;在数据输出状态,根据比较结果(comp)的值来决定状态的转移,如果comp=l,表示P十C在串表中,则将P+c的地址赋给P,状态转移到读下一个字符状态,如果comp一0,表示P+C不在串表
中,则将P十C加入串表,输出数据为P,C的值赋给P,状态转移到读下一个字符状态该模块的接口与内部寄存器定义如下:
module compression(cllk,rst,emPty,full,din,rd_en,wr_en,dout):
input clk,rst://时钟,复位信号
inPut emPty;刀由FIF01输入的空信号
input full;//由FIFOZ输入的满信号
inPut[7:0』din://输入信号
outPut rd_en;刀输出到FIF01的读使能信号
outPut wr_en;//输出到FIF02的写使能信号
outPut[9:0]dout://输出数据
reg rd_en,wr_en;
reg[9:0]dout;
reg[17:o]string--table[1023:01://定义的1024X18的字符串表
reg[9:0]index;//串表索引号
reg[7:0]string_c;当前码字
reg【9:0]string_p前缀码
reg[3:0]State://状态机寄存器
reg[17:0]string--reg;//字符串寄存器(P+C)
reg comP;//字符串比较结果
上面就是论文里关于LZW压缩编码算法的FPGA的实现,我现在用ISE的状态机进行设计时,首先这个压缩编码模块中如何进行初始化,也就是说如何创建这个字符串表,还有就是各个状态的条件和转化的条件怎么写,还有就是上面的程序和状态机如何联系起来呢?
这就是我现在遇到的问题,如果有高手有这方面的研究,小弟不胜感激。如果可以详细给我讲一下的话,希望留下您宝贵的qq,谢谢各位大侠了
此帖出自
小平头技术问答
肯定是通过ROM来实现。初始化mif文件。
一周热门 更多>