一般在进行硬件设计的时候都要用软件模拟一下基本的实现。
上例子:
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
public class Dido {
static final int LEN = 10;
static final int COL = 3;
static final int aLEN = 1;
static final int bLEN = 2;
static final int cLEN = 3;
public static void main(String[] args) {
List<String> frame = new ArrayList<String>();
for(int i=0; i<aLEN; i++) {
for(int j=0; j<COL; j++) {
frame.add("a" + i + ""+j);
}
}
for(int i=0; i<LEN; i++) {
for(int j=0; j<COL; j++) {
frame.add("e" + i + ""+j);
}
}
for(int i=0; i<bLEN; i++) {
for(int j=0; j<COL; j++) {
frame.add("b" + i + ""+j);
}
}
for(int i=0; i<LEN; i++) {
for(int j=0; j<COL; j++) {
frame.add("o" + i + ""+j);
}
}
for(int i=0; i<cLEN; i++) {
for(int j=0; j<COL; j++) {
frame.add("c" + i + ""+j);
}
}
Queue<Integer> eFifo = new ConcurrentLinkedQueue<Integer>();
Queue<Integer> oFifo = new ConcurrentLinkedQueue<Integer>();
Queue<Integer> freeFifo = new ConcurrentLinkedQueue<Integer>();
// initial Memory size
String[] r = new String[(LEN+1)*COL];
// initial freeFifo
for(int i=0; i<LEN+1; i++) {
freeFifo.add(i);
}
int i = 0, addrS=99,addrO=99,colI=0,colO=0;
int rowI = 0,rowO = 0;
String inData, outData = "#";
boolean isOdd = false;
boolean starO = false;
for(int clk=0; clk<200; clk++) {
// input data
inData = frame.get(i++);
if(i == frame.size()) {
i = 0;
}
// save
if((inData.indexOf('e') != -1) || inData.indexOf('o') != -1) {
if(colI == 0) {
rowI = freeFifo.poll();
if(inData.indexOf('e') != -1) {
eFifo.add(rowI);
} else {
oFifo.add(rowI);
}
}
addrS = rowI*COL + colI;
r[addrS] = inData;
colI = (colI+1==COL)?0:colI+1;
}
// output data
if(!eFifo.isEmpty() && !oFifo.isEmpty()) {
starO = true;
}
if(starO) {
if(colO == 0) {
if(isOdd) {
rowO = oFifo.poll();
isOdd = false;
} else {
rowO = eFifo.poll();
isOdd = true;
}
freeFifo.add(rowO);
}
addrO = rowO*COL + colO;
outData = r[addrO];
// colO = (colO+1==COL)?0:colO+1;
if(colO+1==COL) {
colO = 0;
if(eFifo.isEmpty() || oFifo.isEmpty()) {
starO = false;
}
} else {
colO++;
}
} else {
outData = "#";
}
System.out.println(" " +clk + " " +outData+ " " +inData+ " " + addrS+ " "+addrO + "");
}
}
}
上述程序模拟了一个简单的视频pal的变换,输入时的一帧数据是先一些行a,在一些行e(偶数场数据),再一些行b,再一些行o(奇数场数据),在一些行c,这里的abc为无用数据,利用for循环加上clk来模拟硬件的实现,eFifo 、oFifo 、freeFifo分别用来存放 偶数场、奇数场和可用地址。最后无用数据不变,偶数场和奇数场交替输出。
结果为:
0 # a00 99 99 1 # a01 99 99 2 # a02 99 99 3 # e00 0 99 4 # e01 1 99 5 # e02 2 99 6 # e10 3 99 7 # e11 4 99 8 # e12 5 99 9 # e20 6 99 10 # e21 7 99 11 # e22 8 99 12 # e30 9 99 13 # e31 10 99 14 # e32 11 99 15 # e40 12 99 16 # e41 13 99 17 # e42 14 99 18 # e50 15 99 19 # e51 16 99 20 # e52 17 99 21 # e60 18 99 22 # e61 19 99 23 # e62 20 99 24 # e70 21 99 25 # e71 22 99 26 # e72 23 99 27 # e80 24 99 28 # e81 25 99 29 # e82 26 99 30 # e90 27 99 31 # e91 28 99 32 # e92 29 99 33 # b00 29 99 34 # b01 29 99 35 # b02 29 99 36 # b10 29 99 37 # b11 29 99 38 # b12 29 99 39 e00 o00 30 0 40 e01 o01 31 1 41 e02 o02 32 2 42 o00 o10 0 30 43 o01 o11 1 31 44 o02 o12 2 32 45 e10 o20 30 3 46 e11 o21 31 4 47 e12 o22 32 5 48 o10 o30 3 0 49 o11 o31 4 1 50 o12 o32 5 2 51 e20 o40 0 6 52 e21 o41 1 7 53 e22 o42 2 8 54 o20 o50 6 30 55 o21 o51 7 31 56 o22 o52 8 32 57 e30 o60 30 9 58 e31 o61 31 10 59 e32 o62 32 11 60 o30 o70 9 3 61 o31 o71 10 4 62 o32 o72 11 5 63 e40 o80 3 12 64 e41 o81 4 13 65 e42 o82 5 14 66 o40 o90 12 0 67 o41 o91 13 1 68 o42 o92 14 2 69 e50 c00 14 15 70 e51 c01 14 16 71 e52 c02 14 17 72 o50 c10 14 6 73 o51 c11 14 7 74 o52 c12 14 8 75 e60 c20 14 18 76 e61 c21 14 19 77 e62 c22 14 20 78 o60 a00 14 30 79 o61 a01 14 31 80 o62 a02 14 32 81 e70 e00 0 21 82 e71 e01 1 22 83 e72 e02 2 23 84 o70 e10 15 9 85 o71 e11 16 10 86 o72 e12 17 11 87 e80 e20 6 24 88 e81 e21 7 25 89 e82 e22 8 26 90 o80 e30 18 3 91 o81 e31 19 4 92 o82 e32 20 5 93 e90 e40 30 27 94 e91 e41 31 28 95 e92 e42 32 29 96 o90 e50 21 12 97 o91 e51 22 13 98 o92 e52 23 14 99 # e60 9 14 100 # e61 10 14 101 # e62 11 14 102 # e70 24 14 103 # e71 25 14 104 # e72 26 14 105 # e80 3 14 106 # e81 4 14 107 # e82 5 14 108 # e90 27 14 109 # e91 28 14 110 # e92 29 14 111 # b00 29 14 112 # b01 29 14 113 # b02 29 14 114 # b10 29 14 115 # b11 29 14 116 # b12 29 14 117 e00 o00 12 0 118 e01 o01 13 1 119 e02 o02 14 2 120 o00 o10 0 12 121 o01 o11 1 13 122 o02 o12 2 14 123 e10 o20 12 15 124 e11 o21 13 16 125 e12 o22 14 17 126 o10 o30 15 0 127 o11 o31 16 1 128 o12 o32 17 2 129 e20 o40 0 6 130 e21 o41 1 7 131 e22 o42 2 8 132 o20 o50 6 12 133 o21 o51 7 13 134 o22 o52 8 14 135 e30 o60 12 18 136 e31 o61 13 19 137 e32 o62 14 20 138 o30 o70 18 15 139 o31 o71 19 16 140 o32 o72 20 17 141 e40 o80 15 30 142 e41 o81 16 31 143 e42 o82 17 32 144 o40 o90 30 0 145 o41 o91 31 1 146 o42 o92 32 2 147 e50 c00 32 21 148 e51 c01 32 22 149 e52 c02 32 23 150 o50 c10 32 6 151 o51 c11 32 7 152 o52 c12 32 8 153 e60 c20 32 9 154 e61 c21 32 10 155 e62 c22 32 11 156 o60 a00 32 12 157 o61 a01 32 13 158 o62 a02 32 14 159 e70 e00 0 24 160 e71 e01 1 25 161 e72 e02 2 26 162 o70 e10 21 18 163 o71 e11 22 19 164 o72 e12 23 20 165 e80 e20 6 3 166 e81 e21 7 4 167 e82 e22 8 5 168 o80 e30 9 15 169 o81 e31 10 16 170 o82 e32 11 17 171 e90 e40 12 27 172 e91 e41 13 28 173 e92 e42 14 29 174 o90 e50 24 30 175 o91 e51 25 31 176 o92 e52 26 32 177 # e60 18 32 178 # e61 19 32 179 # e62 20 32 180 # e70 3 32 181 # e71 4 32 182 # e72 5 32 183 # e80 15 32 184 # e81 16 32 185 # e82 17 32 186 # e90 27 32 187 # e91 28 32 188 # e92 29 32 189 # b00 29 32 190 # b01 29 32 191 # b02 29 32 192 # b10 29 32 193 # b11 29 32 194 # b12 29 32 195 e00 o00 30 0 196 e01 o01 31 1 197 e02 o02 32 2 198 o00 o10 0 30 199 o01 o11 1 31