基于FFPGA的图像压缩传输与解码系统.docx
- 文档编号:24456211
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:57
- 大小:280.08KB
基于FFPGA的图像压缩传输与解码系统.docx
《基于FFPGA的图像压缩传输与解码系统.docx》由会员分享,可在线阅读,更多相关《基于FFPGA的图像压缩传输与解码系统.docx(57页珍藏版)》请在冰豆网上搜索。
基于FFPGA的图像压缩传输与解码系统
《sopc》课程报告之五
《基于FFPGA的图像压缩传输与解码系统》技术报告
院系:
电子工程学院微电子学系
小组成员:
郭从林朱潮勇杨欢程亭
班级:
电路1103班
组长:
郭从林
学号:
05116093
日期:
2015年1月3日
《基于FFPGA的图像压缩传输与解码系统》技术报告
摘要
本文介绍了基于SOPC的通用嵌入式图像处理系统的实现方法,其中叙述了SOPC及NIOSii嵌入式处理器的特点和使用。
分别具体说明了系统的硬件结构设计和图像处理算法的流程及软件实现,采用此系统可以大大简化图像处理系统的硬件和软件设计,优化系统设计。
关键字:
SOPC(可编程片上系统);嵌入式处理器;静止图像压缩
一、引言
1)随着计算机和多媒体技术的发展,图像等多媒体信源的传输处理显得日益重要,各种图像压缩处理的标准、协议也相继出现,其中JPEG静止图像压缩编码是图像压缩的一项重要技术,也是图像压缩的一个基本指标。
可编程片上系统SOPC(SystemonaProgrammableChip)将处理器、存储器、I/O等系统模块集成到单片FPGA,完成系统的功能设计,使整个系统设计更加灵活,可扩充,可裁减,并且实现了软硬件的可编程,因此本系统采用NiosⅡ嵌入式处理器实现一个通用嵌入式图像处理系统。
2)通过UART传输图像的压缩信息,在sopc中解压并传输到VGA显示器显示
3)实现图像压缩传输,解压缩,显示。
二、功能定义
功能:
定义所开发项目软件与硬件功能;
硬件设计部分
1.使用FPGA普通端口作为GPIO使用。
2.使用FPGA开发板的50MHZ时钟分频后25MHZ作为VGA输出时钟。
3.时钟频率25MHZ完成行扫描信号计数。
4.时钟频率25MHZ完成祯扫描信号计数,并完成祯计数。
5.在行,场信号有效范围内进行VGA数据输出。
软件设计部分
1:
用matlab取图像的reb值,将取出的rgb值写入文件。
2:
读取rbg值,将十六进制数表示的rgb值转化为以该asc||值对应的字符(减少信息传输量),将转化后的的字符写入文件中。
3:
对转化后的文件数据进行压缩,发送目标文件格式为,文件头信息,发送文件的起始信息,用来判定开始发送数据,用三个字节,信息数据为GCL,一个字节表示最后一个字节的有效位,最后一个字节有效位为0bit-8bit之间,一个字节表示文件中rgb的种类,0-255,四字节,表示整个压缩文件的大小,其后数据格式为,字符及字符对应的出现次数,即字符频度信息,字符频度之后对应的是压缩信息。
性能指标:
频率、功耗等各种与系统相关性能指标;
三、系统验证方案
描述系统级的验证方案,要求测试案例覆盖所设计系统的全部功能。
测试案例1:
验证Huffman算法压缩解压缩可行性
1:
编写最简单的huffman树,huffmancode,compresscode。
2:
显示软件统计字符及频度与最小模型是否一样。
3:
显示软件生成的huffmantab与最小模型huffmantab是否一样。
4:
显示软件递归生成的huffmantabcode与最小模型huffmantabcode是否一样。
5显示软件递归生成compressecode与最小模型compresscode是否一样。
测试案例2:
验证UART传输的正确性
利用串口由文件中读取数据,nios接收收据后将数据返回并显示,对比发送接收过程是否有数据丢失。
确保数据正常的传输。
软件功能定义
LCD完成数据的显示。
LCD的控制由8bit数据线,1bit的RS寄存器选择端,1数据寄存器,0表示指令寄存器,EN为1bit的使能端,值由0到1发生跳变,液晶执行指令,RW为1bit的读写信号线,高电平执行读的功能,低电平执行写的功能。
lcd_on为电源端,lcd_blon为背光。
软件详细设计
1:
LCD写命令
voidLCD_Write_Command(BooleanCommand)
{IOWR_ALTERA_AVALON_PIO_DATA(LCD_DATA_ADDRESS,Command);//写数IOWR_ALTERA_AVALON_PIO_DATA(LCD_RS_ADDRESS,0);//指令
IOWR_ALTERA_AVALON_PIO_DATA(LCD_RW_ADDRESS,0);//写入IOWR_ALTERA_AVALON_PIO_DATA(LCD_EN_ADDRESS,1);//使能IOWR_ALTERA_AVALON_PIO_DATA(LCD_EN_ADDRESS,0);//
usleep(2000);//2ms/*延时*/
}
2:
LCD写数据
voidLCD_Write_data(BooleanData)
{IOWR_ALTERA_AVALON_PIO_DATA(LCD_DATA_ADDRESS,Data);//写数据
IOWR_ALTERA_AVALON_PIO_DATA(LCD_RS_ADDRESS,1);//数据
IOWR_ALTERA_AVALON_PIO_DATA(LCD_RW_ADDRESS,0);//写入
IOWR_ALTERA_AVALON_PIO_DATA(LCD_EN_ADDRESS,1);//使能
/*延时150ns*/
IOWR_ALTERA_AVALON_PIO_DATA(LCD_EN_ADDRESS,0);//
usleep(2000);//2ms/*延时*/
}
4:
LCD初始化
voidLCD_Write_Command(BooleanCommand)
{IOWR_ALTERA_AVALON_PIO_DATA(LCD_DATA_ADDRESS,Command);//往数据
IOWR_ALTERA_AVALON_PIO_DATA(LCD_RS_ADDRESS,0);//指令
IOWR_ALTERA_AVALON_PIO_DATA(LCD_RW_ADDRESS,0);//写入
IOWR_ALTERA_AVALON_PIO_DATA(LCD_EN_ADDRESS,1);//使能
IOWR_ALTERA_AVALON_PIO_DATA(LCD_EN_ADDRESS,0);//
usleep(2000);//2ms/*延时*/
}
四、系统顶层设计方案
1.输入输出
1)输入输出管脚定义
信号名
输入/输出/Inout
说明
iCLK_50
输入1位
FPGA系统时钟50MHZ
iCLRN
输入1位
保证整个系统复位
oVGA_R
输出10位
vga数据输出R通道
10bit
oVGA_G
输出10位
vga数据输出G通道
10bit
oVGA_B
输出10位
vga数据输出B通道
10bit
oVGA_SYNC_N
输出1位
低电频控制信号
oVGA_BLANK_N
输出1位
控制ADV7123模拟信号
oVGA_CLOCK
输出1位
vga输出时钟25MHZ
oVGA_HS
输出1位
行同步信号
oVGA_VS
输出1位
场同步信号
2)输入输出时序图
vag输入时钟50mhz,分频产生25mhz,作为vga输出时钟,PLL倍频,200mhz作为cpu时钟,UART接收来自串口数据。
软件读取数据,处理后,输出数据。
2.软件功能定义;
1)软件功能说明
获取发送数据。
中断控制等
2)软件模块划分结构:
画出模块图,说明每个模块的功能
3)软件测试用例说明
1:
编写最简单的huffman树,huffmancode,compresscode。
2:
显示软件统计字符及频度与最小模型是否一样。
3:
显示软件生成的huffmantab与最小模型huffmantab是否一样。
4:
显示软件递归生成的huffmantabcode与最小模型huffmantabcode是否一样。
5显示软件递归生成compressecode与最小模型compresscode是否一样。
3.硬件功能定义;
1)硬件功能说明
数据传输的收发接口,存储数据,VGA显示器接口
2)硬件顶层模块划分
画出硬件模块的顶层设计结构,简单说明每个模块的功能。
3)硬件的测试用例说明
五、硬件模块详细设计
1.VGA接口模块详细设计
1).每个子模块的功能
一,vga_640x480模块,进行计时,来控制显示
二,vga_stripes模块这样每隔16行颜色交替为红色和绿色(且在vidon=1时显示)
三,clkdiv模块:
进行时钟分频,得到该实验需要的25MHZ的时钟;
四,vga_stripes_top模块:
为主调用函数
五,test_vga模块:
激励模块
2).每个子模块的输入输出与时序图
red
mclk
vga_stripes
vga_640x480
clkdiv
vga_stripes_top
mclk
green
Clk25
Vidonhcvc
Clk25
3).子模块的进一步划分
4).每个子模块的测试用例
test_vga
`timescale1ns/1ns
moduletest_vga;
regmclk=0;
reg[3:
0]btn=0;
vga_stripes_topsc(mclk,btn,hsync,vsync,red,green,blue);
initial
$monitor($time,"hsync=%dvsync=%dred=%dgreen=%dblue=%d",
hsync,vsync,red,green,blue);
initial
begin
mclk=0;
#10mclk=~mclk;
end
endmodule
5).每个子模块的代码
2.子模块2详细设计
.....
六、软件子模块详细设计
1.哈弗曼解压缩模块设计
1)子程序功能定义
将接收到的压缩数据进行解压缩
2)子程序输入输出说明
输入为abc_code.txt-------编码文件;
输出为abc_dcode.txt------译码文件。
3)子程序测试用例
4)子程序源代码
#include
#include
#defineMaxNo256
#defineNULL0
typedefstruct
{
unsignedcharsymbol;
intsweight;
}syml_weit;
syml_weit*sw;//存放符号及其权值
typedefstruct
{
intweit;
intlchd;
intrchd;
intpart;
}hufmtree;
hufmtree*htree;//存放Huffman树
intleafnode,totalnode;//叶子节点个数和整棵树的所有节点
unsignedchar*DataBuf;//存放文本文件数据的内存空间
unsignedchar*CodeBook;//存放码本
unsignedchar*CodeBuf;//存放编好的码
unsignedchar*DCodeBuf;
intCodeBookLen;//码本长度
intCodeLen;//码长度
intDCodeLen;
voidCountWeight(unsignedchar*DataBuf,intFileLen);
voidBuildTree();
voidHufmCode(unsignedchar*DataBuf,intFileLen);
voidHufmDCode(unsignedchar*CDataBuf,intCDataLen);
voidmain()
{
FILE*fp1,*fp2,*fp3,*fp4;//文件读取指针
charfilepath[]="abc.txt";
intFileLen;//读入的文件长度
DataBuf=newunsignedchar[1024*1024];
printf("=====HuffmanCodeandDecodebyLiYingle@NDSC====\n\n");
if((fp1=fopen(filepath,"rb"))==NULL)//读入文本文件
{
printf("abcopenerror!
");
}
FileLen=fread(DataBuf,1,1024*1024,fp1);
CountWeight(DataBuf,FileLen);//计算权值
BuildTree();//建树
HufmCode(DataBuf,FileLen);//编码
HufmDCode(CodeBuf,CodeLen);//译码
/////输出码本文件和压缩率
if((fp2=fopen("codebook.txt","w"))==NULL)
{
printf("abc_codebookopenerror!
");
}
fprintf(fp2,"ASCIIWEIGHTCODE\n");
for(inti=0;i { fprintf(fp2,"0x%02x(%8.4f%%): ",*(CodeBook+i*(leafnode+1)), 100.0*sw[i].sweight/htree[totalnode-1].weit); for(intj=0;j<*(CodeBook+i*(leafnode+1)+1);j++) { fprintf(fp2,"%d",*(CodeBook+i*(leafnode+1)+2+j)); } fprintf(fp2,"\n"); } fprintf(fp2,"\n压缩率: %.5f%%",100.0*CodeLen/8/FileLen); /////输出编码文件 if((fp3=fopen("abc_code.txt","w"))==NULL) { printf("abc_codeopenerror! "); } fwrite(CodeBuf,1,CodeLen,fp3); /////输出译码文件 if((fp4=fopen("abc_dcode.txt","wb"))==NULL) { printf("abc_dcodeopenerror! "); } fwrite(DCodeBuf,1,DCodeLen,fp4); fclose(fp1); fclose(fp2); fclose(fp3); fclose(fp4); delete[]DataBuf; delete[]CodeBook; delete[]CodeBuf; delete[]DCodeBuf; } voidCountWeight(unsignedchar*DataBuf,intFileLen) { inti=0,sum=0; intcounter[MaxNo]={0x0}; for(i=0;i { counter[DataBuf[i]]++; } for(i=0;i { if(counter[i]) { leafnode++; } } totalnode=(leafnode-1)+leafnode;//满树情况下的节点个数 sw=newsyml_weit[leafnode];//存放码字和权值 htree=newhufmtree[totalnode];//存放huffman树 intj=0; for(i=0;i { if(counter[i]) { sw[j].sweight=counter[i]; sw[j].symbol=i; htree[j].weit=counter[i]; htree[j].lchd=0; htree[j].rchd=0; htree[j++].part=0; } } } voidBuildTree() { inti=0; intj=leafnode;//非叶子节点的开始 intw1,w2;//两个最小的权值 intp1=-1,p2=-1; for(intleaf=0;leaf { /////////////////////////找权值最小的两个节点/////// for(i=0;i { if(htree[i].part==0) { if(p1==-1) { p1=i; w1=htree[i].weit; } elseif(p2==-1) { if(htree[i].weit>=w1) { p2=i; w2=htree[i].weit; } else { p2=p1; w2=w1; p1=i; w1=htree[i].weit; } break; } } } for(i=0;i { if(htree[i].part==0&&i! =p1&&i! =p2) { if(htree[i].weit { if(htree[i].weit { w2=w1; p2=p1; w1=htree[i].weit; p1=i; } else { w2=htree[i].weit; p2=i; } } } } /////////////////////////////////////////////////// //设置父节点 htree[j].weit=w1+w2; htree[j].lchd=p1; htree[j].rchd=p2; htree[j].part=0; htree[p1].part=j; htree[p2].part=j; p1=-1; p2=-1; j++; } } voidHufmCode(unsignedchar*DataBuf,intFileLen) { CodeBookLen=leafnode*(leafnode+1); CodeBook=newunsignedchar[CodeBookLen];//存放编好的码字 unsignedchar*codetemp=newunsignedchar[leafnode];//临时存放编好的码字 intp; intCodLen; for(inti=0;i { CodLen=0; *(CodeBook+i*(leafnode+1))=sw[i].symbol; p=i; while(htree[p].part) { if(p==htree[htree[p].part].lchd)//p是左孩子 { codetemp[CodLen]=0x0; } else//P是右孩子 { codetemp[CodLen]=0x1; } CodLen++; p=htree[p].part; } *(CodeBook+i*(leafnode+1)+1)=CodLen; for(intj=0;j { *(CodeBook+i*(leafnode+1)+1+CodLen-j)=*(codetemp+j); } } CodeBuf=newunsignedchar[FileLen*(leafnode-1)]; for(intii=0;ii { for(intjj=0;jj { if(*(DataBuf+ii)==*(CodeBook+jj*(leafnode+1))) { for(intkk=0;kk<*(CodeBook+jj*(leafnode+1)+1);kk++) { *(CodeBuf+CodeLen)=*(CodeBook+jj*(leafnode+1)+2+kk); CodeLen++; } } } } } voidHufmDCode(unsignedchar*CDataBuf,intCDataLen) { FILE*lp; inti=0; DCodeBuf=newunsignedchar[1024*1024]; while(i { intp=totalnode-1; while(p>=leafnode) { if(*(CDataBuf+i)==1) p=htree[p].rchd; else p=htree[p].lchd; i++; } *(DCodeBuf+DCodeLen)=sw[p].symbol; DCodeLen++; } } 2.UART串口发射接收设计 1)子程序功能定义 该模块主要用于数据发送与接收,UART_RXD作为接收端,UART_TXD作为发射端 1: 初始化UART,将UART设置为单字节触发模, UART->STATUS.BITS.RRDY=0;UART->SIATUS.BITS.TRDY=0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FFPGA 图像 压缩 传输 解码 系统