最近我一个同学问我如何写一个奇偶校验器,要是组合电路,主要是因为他设计RISC要用,想了半天,想了两中思路,也可以说是一种,那就是查表后化简卡诺图:
主要思路如下:我们把4位的(假如是偶校验)的情况全部列举出来;我们有以下结果:
0000 ->0
0001 ->1
0010 ->1
0011 ->0
0100 ->1
0101 ->0
0110 ->0
0111 ->1
1000 ->1
1001 ->0
1010 ->0
1011 ->1
1100 ->0
1101 ->1
1110 ->1
1111 ->0
两个表项一组合可以得到8位的,同理可以得到32位的,这样级联,关于效率那得自己权衡了!
我的大概代码如下:
激励:
整个思路大概就是这样了!
主要思路如下:我们把4位的(假如是偶校验)的情况全部列举出来;我们有以下结果:
0000 ->0
0001 ->1
0010 ->1
0011 ->0
0100 ->1
0101 ->0
0110 ->0
0111 ->1
1000 ->1
1001 ->0
1010 ->0
1011 ->1
1100 ->0
1101 ->1
1110 ->1
1111 ->0
两个表项一组合可以得到8位的,同理可以得到32位的,这样级联,关于效率那得自己权衡了!
我的大概代码如下:
- module JO(out,in);
- input [3:0] in;
- output out;
- reg out;
- always @(*)
- begin:jo_p01
- case (in)
- 1,2,4,7,8,11,13,14:out<=1'b1;
- default: out<=1'd0;
- endcase
- end
- endmodule
- module JO8(out,in);
- input [7:0] in;
- output out;
- wire out1,out2;
- assign out=out1^out2;
- JO X1(.out(out1),.in(in[3:0]));
- JO X2(.out(out2),.in(in[7:4]));
- endmodule
- `timescale 1ns / 1ns
- module josim();
- reg [7:0] in;
- wire out;
- integer count;
- reg [7:0] test;
- reg result;
- reg outcompare1,outcompare;
- initial begin
- in=0;
- end
- always begin
- #5 in=in+1;
- end
- JO8 XX(.out(out),.in(in));
- always @(in) //在这个块里面,直接算出奇偶校验值,放在outcompare中
- begin
- test=in;
- outcompare1=test[0];
- for(count=0;count<7;count=count+1)
- begin
- test=test>>1;
- if(test[0]) outcompare1=~outcompare1;
- end
- outcompare=outcompare1;
- end
- always @(out) //out 变化要慢于outcompare,理论上来说是同时变化的。
- begin
- if(out==outcompare) result=1;
- else result=0;
- end
- // assign result = out~^outcompare; //这样写会产生毛刺,不利于观测。
- endmodule