硬件设计中的软件模拟

一般在进行硬件设计的时候都要用软件模拟一下基本的实现。

上例子:

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值