基于FPGA的分形编码器verilog设计

Posted fpga和matlab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于FPGA的分形编码器verilog设计相关的知识,希望对你有一定的参考价值。

目录

一、理论基础

二、核心程序

三、仿真测试结果


一、理论基础

       分形图像编码是目前较有发展前途的图像编码方法之一, 也是目前研究较为广泛的编码方法之一。对其研究已有近十年的历史,其间,人们发现了它所具有的许多优点:比如,它突破以往熵压缩编码的界限,在编码过程中,采用了类似描述的方法,而解码是通过迭代完成的,且具有分辨率无关的解码特性等。
       分形图像编码的思想最早由Barnsley和Sloan引入,将原始图像表示为图像空间中一系列压缩映射的吸引子。在此基础上,Jacquin设计了第一个实用的基于方块分割的分形图像编码器,他首先将原始图像分割为值域子块和定义域子块,对于每一个值域子块,寻找一个定义域子块和仿射变换(包括几何变换、对比度放缩和亮度平移),使变换后的定义域子块最佳逼近值域子块。随后Fisher等提出了四象限树编码方案,采用有效的分类技术,极大的提高了编码性能。随着几十种新算法和改进方案的问世,分形图像编码目前已形成了三个主要发展方向:加快分形的编解码速度、提高分形编码质量、分形序列图像编码。       

       分形图像编码是一个相对较新的图像压缩技术。在分形图像编码中,通过利 用自然图像中存在的不同子图像间的跨尺度相似性(即把图像视为分形),一幅图 像用一个使图像近似不变的压缩仿射变换①的参数来表达,压缩文件中储存的是这 些参数的量化值而不是图像本身的象素值。

       分形理论是非线性科学研究中一个十分活跃的分支,特别是近十余年来在计 算机图像处理和分析中已得到广泛应用。同时,要了解分形图像压缩技术的起源, 以及理解该技术的数学原理,分形的概念是必不可少的。

      分形码是由分割信息与变换参数组成的,不同分割方案占有的分割信息量的大小是不同的。 从压缩观点看,分割方案占有的信息量越少越好(最好是零,如固定方块分割),但是,如果一 个不规则分割带来了好的编码质量(失真测度意义下),花费一点编码成本是值得的。选择何种 分割方案有时将对算法的性能、效率等产生很大的影响。 分割是决定压缩比的关键因素,分割也是决定解码图像质量的又一关键因素,一个好的 分割方案应该反映出图像的跨尺度相似性。图像中既有平滑均匀区域(亮度恒定或缓慢变化 的区域),又有高对比度区域(如边缘区域)。在均匀区域部分,使用大块就能实现好的拼贴, 与此同时,高对比区域则需要使用小尺寸块才有可能达到希望的图像质量。要实现这一点, 必须采用更为灵活的分割方法(可变尺寸块分割)。包含四叉树分割在内的各种可变尺寸块分 割方法已经被分形编码文献广泛采用。 

分形编码压缩的步骤:
第一步:把图像划分为互不重叠的、任意大小的的D分区;
第二步:划定一些可以相互重叠的、比D分区大的R分区;
第三步:为每个D分区选定仿射变换表。
分形编码解压步骤:
首先从文件中读取D分区划分方式的信息和仿射变换系数等数据;
然后划定两个同样大小的缓冲区给D图像和R图像,并把R初始化到任一初始阶段;
根据仿射变换系数把其相应的R分区做仿射变换,并用变换后的数据取代该D分区的原有数据;
对D中所有的D分区都进行上述操作,全部完成后就形成一个新的D图像;
再把新D图像的内容拷贝到R中,把新R当作D,D当作R,重复操作(迭代)。

二、核心程序

......................................
		
//	Temps	
//(64*sum(Temp8.*Temp) - sum(Temp8)*sum(Temp)) / (64*sum(Temp.^2) - (sum(Temp))^2);		
wire[15:0]R11,R12,R13,R14,R15,R16,R17,R18;
wire[15:0]R21,R22,R23,R24,R25,R26,R27,R28;
wire[15:0]R31,R32,R33,R34,R35,R36,R37,R38;
wire[15:0]R41,R42,R43,R44,R45,R46,R47,R48;
wire[15:0]R51,R52,R53,R54,R55,R56,R57,R58;
wire[15:0]R61,R62,R63,R64,R65,R66,R67,R68;
wire[15:0]R71,R72,R73,R74,R75,R76,R77,R78;
wire[15:0]R81,R82,R83,R84,R85,R86,R87,R88;
 
 
multip multip_u11r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row1),.datab(i_Trig11),.result(R11));
multip multip_u12r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row2),.datab(i_Trig12),.result(R12));
multip multip_u13r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row3),.datab(i_Trig13),.result(R13));
multip multip_u14r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row4),.datab(i_Trig14),.result(R14));
multip multip_u15r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row5),.datab(i_Trig15),.result(R15));
multip multip_u16r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row6),.datab(i_Trig16),.result(R16));
multip multip_u17r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row7),.datab(i_Trig17),.result(R17));
multip multip_u18r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row8),.datab(i_Trig18),.result(R18));
		
		
multip multip_u21r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row1),.datab(i_Trig21),.result(R21));
multip multip_u22r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row2),.datab(i_Trig22),.result(R22));
multip multip_u23r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row3),.datab(i_Trig23),.result(R23));
multip multip_u24r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row4),.datab(i_Trig24),.result(R24));
multip multip_u25r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row5),.datab(i_Trig25),.result(R25));
multip multip_u26r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row6),.datab(i_Trig26),.result(R26));
multip multip_u27r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row7),.datab(i_Trig27),.result(R27));
multip multip_u28r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row8),.datab(i_Trig28),.result(R28));		
		
		
multip multip_u31r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row1),.datab(i_Trig31),.result(R31));
multip multip_u32r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row2),.datab(i_Trig32),.result(R32));
multip multip_u33r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row3),.datab(i_Trig33),.result(R33));
multip multip_u34r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row4),.datab(i_Trig34),.result(R34));
multip multip_u35r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row5),.datab(i_Trig35),.result(R35));
multip multip_u36r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row6),.datab(i_Trig36),.result(R36));
multip multip_u37r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row7),.datab(i_Trig37),.result(R37));
multip multip_u38r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row8),.datab(i_Trig38),.result(R38));		
		
		
multip multip_u41r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row1),.datab(i_Trig41),.result(R41));
multip multip_u42r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row2),.datab(i_Trig42),.result(R42));
multip multip_u43r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row3),.datab(i_Trig43),.result(R43));
multip multip_u44r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row4),.datab(i_Trig44),.result(R44));
multip multip_u45r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row5),.datab(i_Trig45),.result(R45));
multip multip_u46r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row6),.datab(i_Trig46),.result(R46));
multip multip_u47r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row7),.datab(i_Trig47),.result(R47));
multip multip_u48r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row8),.datab(i_Trig48),.result(R48));		
		
		
multip multip_u51r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row1),.datab(i_Trig51),.result(R51));
multip multip_u52r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row2),.datab(i_Trig52),.result(R52));
multip multip_u53r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row3),.datab(i_Trig53),.result(R53));
multip multip_u54r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row4),.datab(i_Trig54),.result(R54));
multip multip_u55r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row5),.datab(i_Trig55),.result(R55));
multip multip_u56r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row6),.datab(i_Trig56),.result(R56));
multip multip_u57r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row7),.datab(i_Trig57),.result(R57));
multip multip_u58r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row8),.datab(i_Trig58),.result(R58));		
		
		
multip multip_u61r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row1),.datab(i_Trig61),.result(R61));
multip multip_u62r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row2),.datab(i_Trig62),.result(R62));
multip multip_u63r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row3),.datab(i_Trig63),.result(R63));
multip multip_u64r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row4),.datab(i_Trig64),.result(R64));
multip multip_u65r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row5),.datab(i_Trig65),.result(R65));
multip multip_u66r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row6),.datab(i_Trig66),.result(R66));
multip multip_u67r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row7),.datab(i_Trig67),.result(R67));
multip multip_u68r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row8),.datab(i_Trig68),.result(R68));		
		
		
multip multip_u71r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row1),.datab(i_Trig71),.result(R71));
multip multip_u72r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row2),.datab(i_Trig72),.result(R72));
multip multip_u73r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row3),.datab(i_Trig73),.result(R73));
multip multip_u74r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row4),.datab(i_Trig74),.result(R74));
multip multip_u75r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row5),.datab(i_Trig75),.result(R75));
multip multip_u76r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row6),.datab(i_Trig76),.result(R76));
multip multip_u77r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row7),.datab(i_Trig77),.result(R77));
multip multip_u78r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row8),.datab(i_Trig78),.result(R78));		
		
multip multip_u81r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row1),.datab(i_Trig81),.result(R81));
multip multip_u82r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row2),.datab(i_Trig82),.result(R82));
multip multip_u83r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row3),.datab(i_Trig83),.result(R83));
multip multip_u84r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row4),.datab(i_Trig84),.result(R84));
multip multip_u85r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row5),.datab(i_Trig85),.result(R85));
multip multip_u86r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row6),.datab(i_Trig86),.result(R86));
multip multip_u87r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row7),.datab(i_Trig87),.result(R87));
multip multip_u88r(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Range_row8),.datab(i_Trig88),.result(R88));
 
reg[17:0]R11s,R12s;
reg[17:0]R21s,R22s;
reg[17:0]R31s,R32s;
reg[17:0]R41s,R42s;
reg[17:0]R51s,R52s;
reg[17:0]R61s,R62s;
reg[17:0]R71s,R72s;
reg[17:0]R81s,R82s;
 
reg[19:0]R11ss,R12ss;
reg[19:0]R21ss,R22ss;
 
reg[21:0]R1st;
always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
	  begin
	  R11s <= 18'd0;R12s <= 18'd0;
	  R21s <= 18'd0;R22s <= 18'd0;
	  R31s <= 18'd0;R32s <= 18'd0;
	  R41s <= 18'd0;R42s <= 18'd0;
	  R51s <= 18'd0;R52s <= 18'd0;
	  R61s <= 18'd0;R62s <= 18'd0;
	  R71s <= 18'd0;R72s <= 18'd0;
	  R81s <= 18'd0;R82s <= 18'd0;	  
	  R11ss<= 20'd0;R12ss<= 20'd0;
	  R21ss<= 20'd0;R22ss<= 20'd0;
	  R1st <= 22'd0;
	  end
else begin
	  R11s <= R11 + R12 + R13 + R14;
	  R12s <= R15 + R16 + R17 + R18;
	  
	  R21s <= R21 + R22 + R23 + R24;
	  R22s <= R25 + R26 + R27 + R28;
	  
	  R31s <= R31 + R32 + R33 + R34;
	  R32s <= R35 + R36 + R37 + R38;
	  
	  R41s <= R41 + R42 + R43 + R44;
	  R42s <= R45 + R46 + R47 + R48;
	  
	  R51s <= R51 + R52 + R53 + R54;
	  R52s <= R55 + R56 + R57 + R58;
	  
	  R61s <= R61 + R62 + R63 + R64;
	  R62s <= R65 + R66 + R67 + R68;
	  
	  R71s <= R71 + R72 + R73 + R74;
	  R72s <= R75 + R76 + R77 + R78;
	  
	  R81s <= R81 + R82 + R83 + R84;
	  R82s <= R85 + R86 + R87 + R88; 
	  
	  R11ss<= R11s+ R12s+ R21s+ R22s;
	  R12ss<= R31s+ R32s+ R41s+ R42s;
	  R21ss<= R51s+ R52s+ R61s+ R62s;
	  R22ss<= R71s+ R72s+ R81s+ R82s;
	  R1st <= R11ss+R12ss+R21ss+R22ss;
     end
end
 
 
 
 
 
reg[15:0]Y01,Y02,Y03;
 
reg[15:0]Y11,Y12,Y13;
reg[15:0]Y21,Y22,Y23;
reg[15:0]Y31,Y32,Y33;
reg[15:0]Y41,Y42,Y43;
reg[15:0]Y51,Y52,Y53;
reg[15:0]Y61,Y62,Y63;
reg[15:0]Y71,Y72,Y73;
reg[15:0]Y81,Y82,Y83;
 
 
always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
	  begin
     Y01 <= 16'd0;Y02 <= 16'd0;Y03 <= 16'd0;
     Y11 <= 16'd0;Y12 <= 16'd0;Y13 <= 16'd0;
     Y21 <= 16'd0;Y22 <= 16'd0;Y23 <= 16'd0;
     Y31 <= 16'd0;Y32 <= 16'd0;Y33 <= 16'd0;
     Y41 <= 16'd0;Y42 <= 16'd0;Y43 <= 16'd0;
     Y51 <= 16'd0;Y52 <= 16'd0;Y53 <= 16'd0;
     Y61 <= 16'd0;Y62 <= 16'd0;Y63 <= 16'd0;
     Y71 <= 16'd0;Y72 <= 16'd0;Y73 <= 16'd0;
     Y81 <= 16'd0;Y82 <= 16'd0;Y83 <= 16'd0;	  
	  end
else begin
     Y01 <= i_Range_row1+i_Range_row2+i_Range_row3+i_Range_row4;
	  Y02 <= i_Range_row5+i_Range_row6+i_Range_row7+i_Range_row8;
	  Y03 <= Y01 + Y02;
	  
     Y11 <= i_Trig11+i_Trig12+i_Trig13+i_Trig14;
	  Y12 <= i_Trig15+i_Trig16+i_Trig17+i_Trig18;
	  Y13 <= Y11+Y12;
	  
     Y21 <= i_Trig21+i_Trig22+i_Trig23+i_Trig24;
	  Y22 <= i_Trig25+i_Trig26+i_Trig27+i_Trig28;
	  Y23 <= Y21+Y22;
	  
     Y31 <= i_Trig31+i_Trig32+i_Trig33+i_Trig34;
	  Y32 <= i_Trig35+i_Trig36+i_Trig37+i_Trig38;
	  Y33 <= Y31+Y32;
	  
     Y41 <= i_Trig41+i_Trig42+i_Trig43+i_Trig44;
	  Y42 <= i_Trig45+i_Trig46+i_Trig47+i_Trig48;
	  Y43 <= Y41+Y42;
	  
     Y51 <= i_Trig51+i_Trig52+i_Trig53+i_Trig54;
	  Y52 <= i_Trig55+i_Trig56+i_Trig57+i_Trig58;
	  Y53 <= Y51+Y52;
	  
     Y61 <= i_Trig61+i_Trig62+i_Trig63+i_Trig64;
	  Y62 <= i_Trig65+i_Trig66+i_Trig67+i_Trig68;
	  Y63 <= Y61+Y62;
	  
     Y71 <= i_Trig71+i_Trig72+i_Trig73+i_Trig74;
	  Y72 <= i_Trig75+i_Trig76+i_Trig77+i_Trig78;
	  Y73 <= Y71+Y72;
	  
     Y81 <= i_Trig81+i_Trig82+i_Trig83+i_Trig84;
	  Y82 <= i_Trig85+i_Trig86+i_Trig87+i_Trig88;
	  Y83 <= Y81+Y82;  
     end
end
 
 
wire[15:0]Y11s,Y12s,Y13s,Y14s,Y15s,Y16s,Y17s,Y18s;
 
multip multip_u11rr(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(Y01),.datab(Y11),.result(Y11s));
multip multip_u12rr(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(Y01),.datab(Y21),.result(Y12s));
multip multip_u13rr(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(Y01),.datab(Y31),.result(Y13s));
multip multip_u14rr(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(Y01),.datab(Y41),.result(Y14s));
multip multip_u15rr(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(Y01),.datab(Y51),.result(Y15s));
multip multip_u16rr(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(Y01),.datab(Y61),.result(Y16s));
multip multip_u17rr(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(Y01),.datab(Y71),.result(Y17s));
multip multip_u18rr(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(Y01),.datab(Y81),.result(Y18s));
	
 
reg[17:0]R11sss,R12sss;
reg[19:0]R2st;
 
always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
	  begin
     R11sss <= 18'd0;
     R12sss <= 18'd0;
     R2st   <= 20'd0;	  
	  end
else begin
     R11sss <= Y11s+Y12s+Y13s+Y14s;
     R12sss <= Y15s+Y16s+Y17s+Y18s;
     R2st   <= R11sss+R12sss;	  
     end
end
 
//(*)^2
wire[15:0]P11,P12,P13,P14,P15,P16,P17,P18;
wire[15:0]P21,P22,P23,P24,P25,P26,P27,P28;
wire[15:0]P31,P32,P33,P34,P35,P36,P37,P38;
wire[15:0]P41,P42,P43,P44,P45,P46,P47,P48;
wire[15:0]P51,P52,P53,P54,P55,P56,P57,P58;
wire[15:0]P61,P62,P63,P64,P65,P66,P67,P68;
wire[15:0]P71,P72,P73,P74,P75,P76,P77,P78;
wire[15:0]P81,P82,P83,P84,P85,P86,P87,P88;
 
 
multip multip_u11p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig11),.datab(i_Trig11),.result(P11));
multip multip_u12p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig12),.datab(i_Trig12),.result(P12));
multip multip_u13p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig13),.datab(i_Trig13),.result(P13));
multip multip_u14p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig14),.datab(i_Trig14),.result(P14));
multip multip_u15p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig15),.datab(i_Trig15),.result(P15));
multip multip_u16p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig16),.datab(i_Trig16),.result(P16));
multip multip_u17p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig17),.datab(i_Trig17),.result(P17));
multip multip_u18p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig18),.datab(i_Trig18),.result(P18));
		
		
multip multip_u21p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig21),.datab(i_Trig21),.result(P21));
multip multip_u22p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig22),.datab(i_Trig22),.result(P22));
multip multip_u23p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig23),.datab(i_Trig23),.result(P23));
multip multip_u24p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig24),.datab(i_Trig24),.result(P24));
multip multip_u25p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig25),.datab(i_Trig25),.result(P25));
multip multip_u26p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig26),.datab(i_Trig26),.result(P26));
multip multip_u27p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig27),.datab(i_Trig27),.result(P27));
multip multip_u28p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig28),.datab(i_Trig28),.result(P28));		
		
		
multip multip_u31p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig31),.datab(i_Trig31),.result(P31));
multip multip_u32p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig32),.datab(i_Trig32),.result(P32));
multip multip_u33p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig33),.datab(i_Trig33),.result(P33));
multip multip_u34p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig34),.datab(i_Trig34),.result(P34));
multip multip_u35p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig35),.datab(i_Trig35),.result(P35));
multip multip_u36p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig36),.datab(i_Trig36),.result(P36));
multip multip_u37p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig37),.datab(i_Trig37),.result(P37));
multip multip_u38p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig38),.datab(i_Trig38),.result(P38));		
		
		
multip multip_u41p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig41),.datab(i_Trig41),.result(P41));
multip multip_u42p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig42),.datab(i_Trig42),.result(P42));
multip multip_u43p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig43),.datab(i_Trig43),.result(P43));
multip multip_u44p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig44),.datab(i_Trig44),.result(P44));
multip multip_u45p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig45),.datab(i_Trig45),.result(P45));
multip multip_u46p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig46),.datab(i_Trig46),.result(P46));
multip multip_u47p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig47),.datab(i_Trig47),.result(P47));
multip multip_u48p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig48),.datab(i_Trig48),.result(P48));		
		
		
multip multip_u51p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig51),.datab(i_Trig51),.result(P51));
multip multip_u52p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig52),.datab(i_Trig52),.result(P52));
multip multip_u53p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig53),.datab(i_Trig53),.result(P53));
multip multip_u54p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig54),.datab(i_Trig54),.result(P54));
multip multip_u55p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig55),.datab(i_Trig55),.result(P55));
multip multip_u56p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig56),.datab(i_Trig56),.result(P56));
multip multip_u57p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig57),.datab(i_Trig57),.result(P57));
multip multip_u58p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig58),.datab(i_Trig58),.result(P58));		
		
		
multip multip_u61p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig61),.datab(i_Trig61),.result(P61));
multip multip_u62p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig62),.datab(i_Trig62),.result(P62));
multip multip_u63p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig63),.datab(i_Trig63),.result(P63));
multip multip_u64p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig64),.datab(i_Trig64),.result(P64));
multip multip_u65p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig65),.datab(i_Trig65),.result(P65));
multip multip_u66p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig66),.datab(i_Trig66),.result(P66));
multip multip_u67p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig67),.datab(i_Trig67),.result(P67));
multip multip_u68p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig68),.datab(i_Trig68),.result(P68));		
		
		
multip multip_u71p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig71),.datab(i_Trig71),.result(P71));
multip multip_u72p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig72),.datab(i_Trig72),.result(P72));
multip multip_u73p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig73),.datab(i_Trig73),.result(P73));
multip multip_u74p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig74),.datab(i_Trig74),.result(P74));
multip multip_u75p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig75),.datab(i_Trig75),.result(P75));
multip multip_u76p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig76),.datab(i_Trig76),.result(P76));
multip multip_u77p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig77),.datab(i_Trig77),.result(P77));
multip multip_u78p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig78),.datab(i_Trig78),.result(P78));		
		
multip multip_u81p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig81),.datab(i_Trig81),.result(P81));
multip multip_u82p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig82),.datab(i_Trig82),.result(P82));
multip multip_u83p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig83),.datab(i_Trig83),.result(P83));
multip multip_u84p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig84),.datab(i_Trig84),.result(P84));
multip multip_u85p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig85),.datab(i_Trig85),.result(P85));
multip multip_u86p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig86),.datab(i_Trig86),.result(P86));
multip multip_u87p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig87),.datab(i_Trig87),.result(P87));
multip multip_u88p(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(i_Trig88),.datab(i_Trig88),.result(P88));
 
 
reg[17:0]P11s,P12s;
reg[17:0]P21s,P22s;
reg[17:0]P31s,P32s;
reg[17:0]P41s,P42s;
reg[17:0]P51s,P52s;
reg[17:0]P61s,P62s;
reg[17:0]P71s,P72s;
reg[17:0]P81s,P82s;
 
reg[19:0]P11ss,P12ss;
reg[19:0]P21ss,P22ss;
 
reg[21:0]P1st;
always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
	  begin
	  P11s <= 18'd0;P12s <= 18'd0;
	  P21s <= 18'd0;P22s <= 18'd0;
	  P31s <= 18'd0;P32s <= 18'd0;
	  P41s <= 18'd0;P42s <= 18'd0;
	  P51s <= 18'd0;P52s <= 18'd0;
	  P61s <= 18'd0;P62s <= 18'd0;
	  P71s <= 18'd0;P72s <= 18'd0;
	  P81s <= 18'd0;P82s <= 18'd0;	  
	  P11ss<= 20'd0;P12ss<= 20'd0;
	  P21ss<= 20'd0;P22ss<= 20'd0;
	  P1st <= 22'd0;
	  end
else begin
	  P11s <= P11 + P12 + P13 + P14;
	  P12s <= P15 + P16 + P17 + P18;
	  
	  P21s <= P21 + P22 + P23 + P24;
	  P22s <= P25 + P26 + P27 + P28;
	  
	  P31s <= P31 + P32 + P33 + P34;
	  P32s <= P35 + P36 + P37 + P38;
	  
	  P41s <= P41 + P42 + P43 + P44;
	  P42s <= P45 + P46 + P47 + P48;
	  
	  P51s <= P51 + P52 + P53 + P54;
	  P52s <= P55 + P56 + P57 + P58;
	  
	  P61s <= P61 + P62 + P63 + P64;
	  P62s <= P65 + P66 + P67 + P68;
	  
	  P71s <= P71 + P72 + P73 + P74;
	  P72s <= P75 + P76 + P77 + P78;
	  
	  P81s <= P81 + P82 + P83 + P84;
	  P82s <= P85 + P86 + P87 + P88; 
	  
	  P11ss<= P11s+ P12s+ P21s+ P22s;
	  P12ss<= P31s+ P32s+ P41s+ P42s;
	  P21ss<= P51s+ P52s+ P61s+ P62s;
	  P22ss<= P71s+ P72s+ P81s+ P82s;
	  P1st <= P11ss+P12ss+P21ss+P22ss;
     end
end
 
 
 
 
//reg[15:0]Y11,Y12,Y13;
//reg[15:0]Y21,Y22,Y23;
//reg[15:0]Y31,Y32,Y33;
//reg[15:0]Y41,Y42,Y43;
//reg[15:0]Y51,Y52,Y53;
//reg[15:0]Y61,Y62,Y63;
//reg[15:0]Y71,Y72,Y73;
//reg[15:0]Y81,Y82,Y83;
 
 
 
 
wire[15:0]Y11p,Y12p,Y13p,Y14p,Y15p,Y16p,Y17p,Y18p;
 
multip multip_u11pp(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(Y13),.datab(Y13),.result(Y11p));
multip multip_u12pp(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(Y23),.datab(Y23),.result(Y12p));
multip multip_u13pp(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(Y33),.datab(Y33),.result(Y13p));
multip multip_u14pp(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(Y43),.datab(Y43),.result(Y14p));
multip multip_u15pp(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(Y53),.datab(Y53),.result(Y15p));
multip multip_u16pp(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(Y63),.datab(Y63),.result(Y16p));
multip multip_u17pp(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(Y73),.datab(Y73),.result(Y17p));
multip multip_u18pp(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(Y83),.datab(Y83),.result(Y18p));
	
 
 
reg[17:0]Y11ss,Y12ss;
reg[19:0]P2st;
 
always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
	  begin
     Y11ss <= 18'd0;
     Y12ss <= 18'd0;
     P2st  <= 20'd0;	  
	  end
else begin
     Y11ss <= Y11s+Y12s+Y13s+Y14s;
     Y12ss <= Y15s+Y16s+Y17s+Y18s;
     P2st  <= R11ss+R12ss;	  
     end
end
	
 
wire [19:0]D1;
wire [19:0]D2;
assign D1 = R1st-R2st;
assign D2 = P1st-P2st;
	
wire [19:0]Temps;
//divider divider_u(
//	.aclr     (i_rst),
//	.clken    (1'b1),
//	.clock    (i_clk),
//	.denom    (D1),
//	.numer    (D2),
//	.quotient (Temps),
//	.remain   ()
//	);	
	
assign Temps = D1;
		
//	Tempo		(sum(Temp8) - Temps*sum(Temp)) / 64;	
 
 
reg[17:0]T11;
reg[17:0]T12;
reg[17:0]T13;
 
wire[17:0]Tempo;
always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
	  begin
     T11 <= 18'd0;
	  T12 <= 18'd0;
	  T13 <= 18'd0;
	  end
else begin
     T11 <= i_Range_row1 + i_Range_row2 + i_Range_row3 + i_Range_row4;
	  T12 <= i_Range_row5 + i_Range_row6 + i_Range_row7 + i_Range_row8;
	  T13 <= T11 + T12;
     end
end
 
//Y83
assign Tempo=T13-Y83;
	
//	Temph			sum((Temps*Temp + Tempo - Temp8).^2); 
		
wire[15:0]TT11p;
wire[15:0]TT11ps1;
wire[15:0]TT11ps2;
wire[15:0]TT11ps3;
wire[15:0]TT11ps4;
wire[15:0]TT11ps5;
wire[15:0]TT11ps6;
wire[15:0]TT11ps7;
wire[15:0]TT11ps8;
 
multip multip_u11ppp(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(Temps[19:12]),.datab(Y83[15:8]),.result(TT11p));
 
	
assign TT11ps1=TT11p-Tempo[17:2]+i_Range_row1;
assign TT11ps2=TT11p-Tempo[17:2]+i_Range_row2;
assign TT11ps3=TT11p-Tempo[17:2]+i_Range_row3;
assign TT11ps4=TT11p-Tempo[17:2]+i_Range_row4;
assign TT11ps5=TT11p-Tempo[17:2]+i_Range_row5;
assign TT11ps6=TT11p-Tempo[17:2]+i_Range_row6;
assign TT11ps7=TT11p-Tempo[17:2]+i_Range_row7;
assign TT11ps8=TT11p-Tempo[17:2]+i_Range_row8;	
		
		
 
reg[17:0]T111;
reg[17:0]T112;
reg[17:0]T113;
always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
	  begin
     T111 <= 18'd0;
	  T112 <= 18'd0;
	  T113 <= 18'd0;
	  end
else begin
     T111 <= TT11ps1 + TT11ps2 + TT11ps3 + TT11ps4;
	  T112 <= TT11ps5 + TT11ps6 + TT11ps7 + TT11ps8;
	  T113 <= T111 + T112;
     end
end		
 
wire[15:0]Temph;		
multip multip_u11pppp(.aclr(i_rst),.clken(1'b1),.clock(i_clk),.dataa(T113[15:8]),.datab(T113[15:8]),.result(Temph));		
		
				  
//wire[15:0]Temph;					  
//wire[17:0]Tempo;			  
//wire [19:0]Temps;	  
	
 
wire[15:0]Temph2;					  
wire[15:0]Tempo2;			  
wire[15:0]Temps2;	
 
assign Temph2 = Temph[15:0];
assign Tempo2 = Tempo[15:0];				  
assign Temps2 = Temps[15:0];				  
				  
				  
reg[8:0]CNTER;
always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
	  begin
	  CNTER <= 9'd0;
	  end
else begin
     CNTER <= CNTER + 9'd1;
     end
end				  
				  
				  
				  
				  
				  
reg[15:0]o_Fs;
reg[15:0]o_Fo;
reg[15:0]o_XY;
reg[15:0]o_Tw;					  
 
..................................
 
 

三、仿真测试结果

这个是编码输出。:具体的仿真效果如下所示:

A23-31 

以上是关于基于FPGA的分形编码器verilog设计的主要内容,如果未能解决你的问题,请参考以下文章

FPGA+JPEG基于FPGA的JPEG图像编码系统verilog设计

FPGA教程案例97信道编译码1——基于FPGA的卷积编码维特比译码verilog实现,MATLAB辅助验证

FPGA教程案例8基于verilog的分频器设计与实现

FPGA教程案例95机器学习2——基于FPGA的SVM支持向量机二分类系统实现之Verilog编程设计

FPGA教程案例7基于verilog的计数器设计与实现

FPGA教程案例10基于Verilog的复数乘法器设计与实现