7-세그먼트 디코더, 크기 비교기

2023. 6. 9. 12:04[Harman] 세미콘(semiconductor) 아카데미-반도체설계/Verilog를 이용한 RTL 시스템 반도체 설계

728x90
  • 7-세그먼트 디코더

하나의 7-세그먼트에서는 한 자리 16진수 출력이 가능. 그러나 FPGA에서 16진수를저장하기 위한 비트의 크기는 4비트이며, 4비트에 저장된 수를 7-세그먼트로 출력하기 위해서는 디코딩 과정이 필요

-> 4비트에 저장된 하나의 16진수를 7-세그먼트에 출력하는 디코더 설계

 

  1. 스위치로 입력된 값을 16진수로 7-세그먼트에 출력되도록 설계
  2. 스위치에 입력된 키 값은 signal seg에 저장되고, case~when에서 seg에 저장된 값에따라 7-세그먼트에 출력할 값을 지정
    → 스위치 인코더에 디코딩을 실행하는 프로세스 추가
module fnd_decoder(
    input clk,              //clk
    input [3:0] a, b,       //fnd input 2select
    output reg [6:0] FND, // fnd output 2select
    output reg FNDSel1, FNDSel2, FNDSel3, FNDSel4
);

    reg [6:0] FNDa, FNDb;
    reg clk100Hz;
    integer m = 0;
    
    always @ (posedge clk) begin
        if (m >= 499_999) begin
           m <= 0;
           clk100Hz <= ~clk100Hz;
        end else begin
            m <= m + 1;
        end
    end
   
    always @ (posedge clk) begin
        case (a)
            4'b0000: FNDa <= 7'h40;
            4'b0001: FNDa <= 7'h79;
            4'b0010: FNDa <= 7'h24;
            4'b0011: FNDa <= 7'h30;
            4'b0100: FNDa <= 7'h19;
            4'b0101: FNDa <= 7'h12;
            4'b0110: FNDa <= 7'h02;
            4'b0111: FNDa <= 7'h58;
            4'b1000: FNDa <= 7'h00;
            4'b1001: FNDa <= 7'h10;
            4'b1010: FNDa <= 7'h20;
            4'b1011: FNDa <= 7'h03;
            4'b1100: FNDa <= 7'h27;
            4'b1101: FNDa <= 7'h21;
            4'b1110: FNDa <= 7'h04;
            4'b1111: FNDa <= 7'h0e;  
        endcase 
        
        case (b)
            4'b0000: FNDb <= 7'h40;
            4'b0001: FNDb <= 7'h79;
            4'b0010: FNDb <= 7'h24;
            4'b0011: FNDb <= 7'h30;
            4'b0100: FNDb <= 7'h19;
            4'b0101: FNDb <= 7'h12;
            4'b0110: FNDb <= 7'h02;
            4'b0111: FNDb <= 7'h58;
            4'b1000: FNDb <= 7'h00;
            4'b1001: FNDb <= 7'h10;
            4'b1010: FNDb <= 7'h20;
            4'b1011: FNDb <= 7'h03;
            4'b1100: FNDb <= 7'h27;
            4'b1101: FNDb <= 7'h21;
            4'b1110: FNDb <= 7'h04;
            4'b1111: FNDb <= 7'h0e;
            endcase 
        end
        
        always @ (clk100Hz, FNDa, FNDb) begin
        if (clk100Hz) begin
            FNDSel1 <= 1'b1;
            FNDSel2 <= 1'b0;
            FNDSel3 <= 1'b1;
            FNDSel4 <= 1'b1;
            FND = FNDb;
        end else begin
            FNDSel1 <= 1'b0;
            FNDSel2 <= 1'b1;
            FNDSel3 <= 1'b1;
            FNDSel4 <= 1'b1;
            FND = FNDa;
        end
    end
    
endmodule
//xdc파일 
## Clock signal
set_property -dict { PACKAGE_PIN W5   IOSTANDARD LVCMOS33 } [get_ports clk]
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk]

## Switches
set_property -dict { PACKAGE_PIN V17   IOSTANDARD LVCMOS33 } [get_ports {a[0]}]
set_property -dict { PACKAGE_PIN V16   IOSTANDARD LVCMOS33 } [get_ports {a[1]}]
set_property -dict { PACKAGE_PIN W16   IOSTANDARD LVCMOS33 } [get_ports {a[2]}]
set_property -dict { PACKAGE_PIN W17   IOSTANDARD LVCMOS33 } [get_ports {a[3]}]
set_property -dict { PACKAGE_PIN W15   IOSTANDARD LVCMOS33 } [get_ports {b[0]}]
set_property -dict { PACKAGE_PIN V15   IOSTANDARD LVCMOS33 } [get_ports {b[1]}]
set_property -dict { PACKAGE_PIN W14   IOSTANDARD LVCMOS33 } [get_ports {b[2]}]
set_property -dict { PACKAGE_PIN W13   IOSTANDARD LVCMOS33 } [get_ports {b[3]}]

##7 Segment Display
set_property -dict { PACKAGE_PIN W7   IOSTANDARD LVCMOS33 } [get_ports {FND[0]}]
set_property -dict { PACKAGE_PIN W6   IOSTANDARD LVCMOS33 } [get_ports {FND[1]}]
set_property -dict { PACKAGE_PIN U8   IOSTANDARD LVCMOS33 } [get_ports {FND[2]}]
set_property -dict { PACKAGE_PIN V8   IOSTANDARD LVCMOS33 } [get_ports {FND[3]}]
set_property -dict { PACKAGE_PIN U5   IOSTANDARD LVCMOS33 } [get_ports {FND[4]}]
set_property -dict { PACKAGE_PIN V5   IOSTANDARD LVCMOS33 } [get_ports {FND[5]}]
set_property -dict { PACKAGE_PIN U7   IOSTANDARD LVCMOS33 } [get_ports {FND[6]}]

set_property -dict { PACKAGE_PIN U2   IOSTANDARD LVCMOS33 } [get_ports {FNDSel1}]
set_property -dict { PACKAGE_PIN U4   IOSTANDARD LVCMOS33 } [get_ports {FNDSel2}]
set_property -dict { PACKAGE_PIN V4   IOSTANDARD LVCMOS33 } [get_ports {FNDSel3}]
set_property -dict { PACKAGE_PIN W4   IOSTANDARD LVCMOS33 } [get_ports {FNDSel4}]

 

7 - Segment Decoder

 


  • 멀티플렉서(Multiplexer, MUX)

n비트의 선택 신호로 2n 비트의 입력 신호 중 하나를 선택하여 출력

 

4x1 멀티플렉서 : 2비트의 선택 신호로 4(=22) 비트의 입력 신호 중 하나를선택하여 출력
-> 4 개의 입력중 하나를 선택해서 출력 à case 혹은 if 조건문 사용 가장 용이

 

멀티플렉서 블록도 / 진리표

 

  • case문 이용하여 설계 시 
  1. 일반적으로 begin과 end는 그룹화하기 위해 if 혹은 case문장과 함께 사용
  2. [Begin : MUX] -> 블록 이름을 MUX로 지정해 블록 구분 가능 / 순차블록

 

  • [Note]
  1. 이름을 가진 블록 [Begin : MUX ~ end]
  2. 순차블록은 begin ~ end로 구성되며, 문장을 그룹화하기 위해 if, case또는 for과 함께 사용
  3. Begin ~ end로 구분되는 다수의 문장을 구분하기 위해 '이름을 가진 블록' 구조를 제공
  4. case와 if로 설계된 멀티플렉서에서 블록 이름 'MUX'를 사용

 

  • 디멀티플렉서

하나의 입력을 여러 개의 출력중 하나로 전송

 

1x4 디멀티플렉서 : 입력을 4개의 출력중 하나로 전송
-> 4개의 출력중 하나를 선택하려면 선택 신호 2개가 필요

 

입력 출력
data a1 a0 y3 y2 y1  
D 0 0 0 0 0 0
D 0 1 0 0 D 0
D 1 0 0 D 0 0
D 1 1 D 0 0 0

 

 

  • 크기 비교기

조합논리회로로서 두 수를 비교하는 동작

2개의 n비트의 수 비교를 위한 회로는 2^2n개의 입력

 

입력에 대해 1001 / xor가 서로다른입력이들어왔을 때 1 -> nxor를 이용해 출력 구성가능

1비트 비교기 진리표

 

Verilog에선 비교기대신 관계연산자를 사용해도 비교기의 기능을 사용할 수 있다.

관계 연산자 식  의미
a < b a가 b보다 작다
a > b a가 b보다 크다
a <= b a가 b보다 작거나 같다
a >= b a가 b보다 크거나 같다

 

정렬(Sorting) 회로: 두 수를 입력 받아 크기를 비교한 후에 큰 수를 max 7-세그먼트에 출력하고 작은 수를 min 7-세그먼트에 출력
→ 앞의 비교기 회로와 매우 유사하게 입력되는 두 수를 비교해서 큰 수와 작은 수로 분류를 한 후 출력하는 회로

정렬회로 블록도

  1. 수 정렬회로: 두 수를 입력받아 크기를 비교한 후 큰 수(max)를 FND 에 / 작은 수(min)를 FND에 출력
  2. 크기 비교기와 유사하게 입력된느 두 수를 비교해서 큰수와 작은 수로 분류한 다음 출력하는 회로