Excess-3 Code(Gray Code)란 0~9까지의 BCD코드를 3더한 순서로 나열한것으로
0011,0100,0110….,1100 으로 나오는 것이다.
다른말로는 BCD to Excess 3 Code Converter라고도 하는데 이것을
Verilog HDL을 이용해 3가지 방법 즉,
1. Gate Level Description(게이트 수준기술)
2. Dataflow Description(데이터플로우 수준기술)
3. Behavioral Description(동작 수준기술)
로 나타내면 다음과 같이 코딩할수 있다.
1. Gate Level Description
module BinaryToGray(A,B,C,D,w,x,y,z);
input A,B,C,D;
output w,x,y,z;
wire w1,w2,w3,w4,w5,w6,w7;
not g1(z,D);
and g2(w1,D,C);
or g3(w2,D,C);
not g4(w3,B);
not g5(w7,w2);
or g6(y,w1,w7);
and g7(w4,w7,B);
and g8(w5,w2,w3);
and g9(w6,w2,B);
or g10(x,w4,w5);
or g11(w,w6,A);
endmodule
2. Dataflow Description
module BinaryToGray(A,B,C,D,w,x,y,z);
input A,B,C,D;
output w,x,y,z;
assign z = ~D,
y = (D&C)|(~(C|D)),
x = ((~(C|D))&B) | ((C|D)&(~B)),
w = ((C|D)&B)|A;
endmodule
3. Behavioral Description
module BinaryToGray(A,B,C,D,w,x,y,z);
input A,B,C,D;
output w,x,y,z;
reg [3:0] E;
wire [3:0] state;
parameter S0=4’b0000, S1=4’b0001, S2=4’b0010, S3=4’b0011, S4=4’b0100,
S5=4’b0101, S6=4’b0110, S7=4’b0111, S8=8’b1000, S9=4’b1001;
assign w=E[3], x=E[2], y=E[1], z=E[0];
assign state[3] = A, state[2] = B, state[1] = C, state[0] = D;
always @ (state)
case(state)
S0 : E = 4’b0011;
S1 : E = 4’b0100;
S2 : E = 4’b0101;
S3 : E = 4’b0110;
S4 : E = 4’b0111;
S5 : E = 4’b1000;
S6 : E = 4’b1001;
S7 : E = 4’b1010;
S8 : E = 4’b1011;
S9 : E = 4’b1100;
default : E = 4’b0000;
endcase
endmodule
이렇게 가능하다.
이것을 보면 동작수준 모델이 항상 최선의 선택이 아님을 알수있다.
때로는 다른방법이 더 짧게 코딩이 될수도 있다.