본문 바로가기

FPGA

[FPGA] 6. Basys3 두 개로 Encoder <--> Decoder 구현 / 7-SEG Decoder 구현

지난 글에서 Basys3를 이용하여 4Bits 전가산기를 구현해보았다. 이번 글에서는  첫 번째로, Basys3 두 개로 한 쪽에서는 Encoder , Basys3 한 쪽에서는 Decoder의 역할을 지정하여 Decoder 쪽에서 스위치 0번부터 스위치 3번으로 반대편 Decoder의 LED로 버튼의 상태를 체크하도록 구현할 것이다. 통신 방법은 JA포트의 0번과 1번에 점퍼선을 연결하여 통신할 것이다. 두 번째로는 FND를 이용하여 Decoder를 구현할 것이다.

 

<Basys3 두 개로 Encoder <--> Decoder 구현>

1. Encoder와 Decoder의 코드 작성


먼저 각 Basys3에 입력할 Encoder와 Decoder의 코드를 작성하겠다.

`timescale 1ns / 1ps

module encoder_4_2(
    input [3:0] D,
    output [1:0] B
    );
    
    or(B[0], D[3], D[1]);
    or(B[1], D[3], D[2]);
endmodule

4비트 입력과 2비트 출력을 갖는 인코더 코드이다.

module decoder_2_4(
    input [1:0] A,
    output [3:0] Y
    );
    wire [1:0] Abar;
    
    not(Abar[0], A[0]);
    not(Abar[1], A[1]);
    
    and(Y[0], Abar[0], Abar[1]);
    and(Y[1], A[0], Abar[1]);
    and(Y[2], Abar[0], A[1]);
    and(Y[3], A[0], A[1]);
    
endmodule

2비트 입력과 4비트 출력을 갖는 디코더 코드이다.

 

2. 코드 작성을 완료했다면 목적에 맞게 xdc 코드를 수정


목적에 맞게 xdc코드를 수정하자. 먼저 Encoder를 위한 xdc 코드 수정이다. 먼저 스위치를 통해 Encoder의 출력 값을 만들어야한다. 따라서 위 코드에서 선언한 input D[0]~D[3]을 스위치 1번부터 4번에 각각 매핑을 시켜준다. 또한 스위치를 통해 출력 값을 Decoder로 보내야하므로 JA1과 JA2에 연결되어있는 점퍼선으로 데이터를 보내야하기 때문에, output B[0]과 B[1]을 각각 매핑시킨다. 

 

 아래는 Decoder쪽의 Basys3에 대한 xdc 코드 수정 사진이다. 먼저, Encoder로부터 JA1과 JA2에서 데이터를 받아야하기 때문에 위 Decoder의 코드에서 선언한 input A[0]와 A[1] 을 JA1과 JA2에 매핑시킨다. 또한 받은 값을 Decoding하여 LED로 출력해야하기 때문에, LED포트에 V[0]~V[3]을 매핑시켜준다.

 

 

 

3. 연결할 Basys3보드를 점퍼선으로 연결

 

 

위 사진과 같이 Basys3의 JA1과 JA2를 각각 점퍼선으로 연결시켜준다.

 

4. Generate bitstream을 통해 Basys3에 프로그램 다운로드하기

 

저번 글에서 언급한대로 Generate bitstream을 통해 bitstream을 생성하고 Basys3에 다운로드하는 과정을 거쳐야한다.

 

5. 동작 영상 


먼저 SW3, SW2, SW1, SW0 순서로 왼쪽 Basys3의 스위치를 ON/OFF 할 때마다 오른쪽 Basys3의 LED에 Decoding 되어 그대로 반영되는 것을 알 수 있다.

 

동작 영상

<7-SEG Decoder 구현>

한다. 먼저 7-SEG를 동작시키기 위해서는 Basys3에 연결되어있는 7-SEG에 대해 알아야한다. 아래는 Basys3에 나와있는 데이터 시트 내에 FND의 회로도 사진이다. 사진 오른편에 AN n 이라고 적혀져 있는 것을 볼 수 있으므로, 공통 애노드 타입의 FND인 것을 알 수 있고, 공통 애노드의 경우, 양의 전압을 공통으로 놓고 있기 때문에, Verilog상에서 VCC를 0로 놓을 경우, ON이 되고, VCC를 1로 놓을 경우 전위차가 없기에 OFF가 된다. 이를 이용하여 VCC를 GND로 놓고 모든 FND를 ON 시킬 수 있다.

 

 

digilent사 제공 Basys3 Data sheet

 

 동작의 구성은 SW0~SW3 총 4개의 스위치로 4비트 값을 받을 것이다. 그리고 결과 변수를 선언하여 입력 값과 세그먼트에 맞는 값을 결과 변수에 저장할 것이고 이를 FND를 통해 나타낼 것이다. 이를 위해 코드 작성과 스위치와 FND에 포트를 할당해야하므로 xdc를 수정한다. 

7-SEG Decoder 진리표

위 진리표는 7-SEG Decoder 진리표의 진리표이다. 4비트 input값에 4비트를 받으면 case 문을 통해 7비트짜리 output값에 7비트를 저장할 것이다. 위 진리표에 맞게 FND를 설정한다. 

 

 

 

1. 7-SEG Decoder 코드 작성


먼저 Basys3에 입력할 7-SEG Decoder의 코드를 작성할 것이다.

 

(1) 스위치를 통해 값을 받아야 하므로 4비트 Input값 hex_value를 선언한다.

 

(2) 스위치 값에 따라 FND를 출력하기 위해 값을 저장할 7비트 Output값 seg_7을 선언하였다. FND를 위해 값을 저장하고 읽어야하므로 reg 타입으로 선언하였다.

 

(3) 또한 공통애노드 타입의 FND이므로 공통 애노드를 활성화 시키기 위해서는 포트를 모두 0으로 할당하여야한다. 4개의 포트를 0으로 만들어주어야하기 때문에 com_an 4비트를 선언하고, always문 내에서 0으로 초기화 시켜준다.

 

(4) 앞서 말한대로 always문을 통해 스위치 입력 값(hex_value)이 바뀔 때마다 아래 case문이 작동할 것이고, 스위치에 할당된 값에 맞게 변화될 것이다.

 

module decoder_7_seg(
    input [3:0] hex_value,
    output reg [6:0] seg_7,
    output reg [3:0] com_an
    );
   
   always @(hex_value) begin
        com_an = 0;
        case (hex_value)
            4'b0000 : seg_7 = 7'b1000000;   //0
            4'b0001 : seg_7 = 7'b1111001;   //1
            4'b0010 : seg_7 = 7'b0100100;   //2 
            4'b0011 : seg_7 = 7'b0110000;   //3
            4'b0100 : seg_7 = 7'b0011001;   //4
            4'b0101 : seg_7 = 7'b0010010;   //5
            4'b0110 : seg_7 = 7'b0000010;   //6
            4'b0111 : seg_7 = 7'b1111000;   //7
            4'b1000 : seg_7 = 7'b0000000;   //8
            4'b1001 : seg_7 = 7'b0010000;   //9
            4'b1010 : seg_7 = 7'b0001000;   //A
            4'b1011 : seg_7 = 7'b0000011;   //B
            4'b1100 : seg_7 = 7'b1000110;   //C
            4'b1101 : seg_7 = 7'b0100001;   //D
            4'b1110 : seg_7 = 7'b0000110;   //E
            4'b1111 : seg_7 = 7'b0001110;   //F         
        endcase
   end 
    
endmodule

 

2. 7-SEG Decoder  목적에 맞게 xdc 코드를 수정


각 세그먼트의 포트를 seg_7의 0부터 6번까지의 비트로 할당해주고, 공통 애노드에 0 값을 할당해줄 com_an도 할당한다.

입력을 받을 스위치를 사용해야하기 때문에 코드에서 input으로 선언하였던 hex_value 또한 스위치 포트에 할당해준다.

 

3. Generate bitstream을 통해 Basys3에 프로그램 다운로드하기

 

지난 글에서 언급한대로 진행할 것이다. 실행과정은 과정은 생략.

 

 

4. 동작 영상 


각 스위치 SW[3], SW[2], SW[1], SW[0] 순으로  8, 4, 2, 1의 값을 갖는다. 따라서 아래 스위치의 값에 맞게 설정할 때마다 FND의 값이 바뀜을 알 수 있다.