설계, 가산기, 디코더, 인코더, 스위칭 인코더

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

728x90

Xilinx ISE Design Suite를 이용한 schematic 설계

 

  1. 구조적 기술
    1. 컴포넌트 간의 접속
  2. 동작적 기술
    1. 알고리즘 기술
    2. 데이터 흐름 기술

 

구조적 기술 + 동작적 기술 => 물리적 구현

 

  • wire

회로에서 물리적인 연결선 나타낸다. 게이트 또는 모듈을 연결, function, block에서 일을 수 있지만 값을 할당받지는 못하며 저장도 못한다.

 

 

  • reg

프로시저 할당문에서 값을 저장,function, always와 같은 프로시저 블록에서만 사용가능.

 

  1. procedural(blocking) assignment (=)
    1. always와 같은 프로시저에서 reeg변수와 integer에만 할당
    2. 변수a에서 b를 통해 c로 전다될 때 세 변수가 동시에 같은 값을 가짐, 한클럭에서 세 변수에 모두 전달, 문장의 나열 순서에 영향을 받지 않는다.
  2. RTL nonblocking assignment (<=)
    1. 한 클럭에 a에서 b로 전달되고,. 다음클럭에선 b에서 c로 전달된다.

 

  • always 블럭
  1. RTL 모델링의 기본적인 구조체이며, 한 module은 여러 개 always 블록을 포함 가능
  2. 각 always 블록이 연속 할당문 처럼 동시에 실행
  3. 래치. 플립플롭, 조합논리회로의 동작을 표현
  4. always 블록 형식

 


 

 

  • 전가산기

 

진리표를 Verilog형식으로 표현

- 간소화 과정이 필요 없으므로 설계 시간 감소. 간소화 오류를 없앰

- 진리표를 작성하며, 입력이 많아지면 코드의 길이 증가

 

설계는 

  1. 진리표를 이용한 설계
  2. 논리식 유도를 이용한 설계

가 존재.

//진리표를 이용한 설계
module full_adder(x,y,z,S,C);
    input x,y,z;
    output S,C;
    
    reg S,C;
    wire [2:0] k;
    
    assign k = {x,y,z};
    
    always @ (k)
    begin
        case(k)
            3'b000 : begin
                S <= 1'b0;
                C <= 1'b0;
            end
            3'b001 : begin
                S <= 1'b1;
                C <= 1'b0;
            end
            3'b001 : begin
                S <= 1'b1;
                C <= 1'b0;
            end
            3'b011 : begin
                S <= 1'b0;
                C <= 1'b1;
            end
            3'b100 : begin
                S <= 1'b1;
                C <= 1'b0;
            end
            3'b101 : begin
                S <= 1'b0;
                C <= 1'b1;
            end
            3'b110 : begin
                S <= 1'b0;
                C <= 1'b1;
            end
            3'b111 : begin
                S <= 1'b1;
                C <= 1'b1;
            end
        endcase
    end    
endmodule

//논리식을 이용한 Verilog 표현
module full_adder(x,y,z,S,C);
    input x,y,z;
    output S,C;
    
    assign S = (~x&~y&z) | (~x&y&~z) | (x&~y&~z) | (x&y&z);
    assign C = (x&y) | (x&z) | (y&z);
    
endmodule
  1. 진리표를 작성하거나 논리식을 세우는 과정이 없으므로 시간을 줄이고 설계과정에서 오류가 발생할 확률도 감소
  2. 가산기의 입력 비트가 증가해도 코드의 길이는 증가하지 않음

 


 

 

  • 디코더

n개의 입력을 받아서 최대 2^n개의 최소항을 발생시키는 회로 

 

//디코더 코드
module decoder(x, D, en);

    input [2:0] x;
    input en;
    output [7:0] D;
    
    reg [7:0] D;
    
    always @ (en or x)
    begin
        D = 8'h00;
        if(en) begin
            case (x)
                3'h0 : D = 8'h01;
                3'h1 : D = 8'h02;
                3'h2 : D = 8'h04;
                3'h3 : D = 8'h08;
                3'h4 : D = 8'h10;
                3'h5 : D = 8'h20;
                3'h6 : D = 8'h40;
                3'h7 : D = 8'h80;
            endcase
        end
    end            
endmodule

 

// 테스트벤치 코드
module decoder_tb;

    // 모듈 인스턴스화
    decoder dut (
        .x(x),
        .en(en),
        .D(D)
    );
    
    // 입력 신호 선언
    reg [2:0] x;
    reg en;
    
    // 출력 신호 선언
    wire [7:0] D;
    
    // 테스트 시나리오
    initial begin
        // 입력 값 설정
        x = 3'b000;
        en = 0;
        
        // 0 입력에 대한 시뮬레이션
        #10;
        x = 3'b000;
        en = 1;
        #10;
        en = 0;
        
        // 1 입력에 대한 시뮬레이션
        #10;
        x = 3'b001;
        en = 1;
        #10;
        en = 0;
        
        // 2 입력에 대한 시뮬레이션
        #10;
        x = 3'b010;
        en = 1;
        #10;
        en = 0;
        
        // 3 입력에 대한 시뮬레이션
        #10;
        x = 3'b011;
        en = 1;
        #10;
        en = 0;
        
        // 4 입력에 대한 시뮬레이션
        #10;
        x = 3'b100;
        en = 1;
        #10;
        en = 0;
        
        // 5 입력에 대한 시뮬레이션
        #10;
        x = 3'b101;
        en = 1;
        #10;
        en = 0;
        
        // 6 입력에 대한 시뮬레이션
        #10;
        x = 3'b110;
        en = 1;
        #10;
        en = 0;
        
        // 7 입력에 대한 시뮬레이션
        #10;
        x = 3'b111;
        en = 1;
        #10;
        en = 0;
        
        // 시뮬레이션 종료
        #10;
        $finish;
    end
    
    // 입력 신호 및 출력 신호 값 출력
    always @(x or en or D)
        $display("x = %b, en = %b, D = %h", x, en, D);
        
endmodule

Simulation

 

//Basys_3_Master.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 {en}]
set_property -dict { PACKAGE_PIN V16   IOSTANDARD LVCMOS33 } [get_ports {x[0]}]
set_property -dict { PACKAGE_PIN W16   IOSTANDARD LVCMOS33 } [get_ports {x[1]}]
set_property -dict { PACKAGE_PIN W17   IOSTANDARD LVCMOS33 } [get_ports {x[2]}]

## LEDs
set_property -dict { PACKAGE_PIN U16   IOSTANDARD LVCMOS33 } [get_ports {D[0]}]
set_property -dict { PACKAGE_PIN E19   IOSTANDARD LVCMOS33 } [get_ports {D[1]}]
set_property -dict { PACKAGE_PIN U19   IOSTANDARD LVCMOS33 } [get_ports {D[2]}]
set_property -dict { PACKAGE_PIN V19   IOSTANDARD LVCMOS33 } [get_ports {D[3]}]
set_property -dict { PACKAGE_PIN W18   IOSTANDARD LVCMOS33 } [get_ports {D[4]}]
set_property -dict { PACKAGE_PIN U15   IOSTANDARD LVCMOS33 } [get_ports {D[5]}]
set_property -dict { PACKAGE_PIN U14   IOSTANDARD LVCMOS33 } [get_ports {D[6]}]
set_property -dict { PACKAGE_PIN V14   IOSTANDARD LVCMOS33 } [get_ports {D[7]}]

## Configuration options, can be used for all designs
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property CFGBVS VCCO [current_design]

## SPI configuration mode options for QSPI boot, can be used for all designs
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE 33 [current_design]
set_property CONFIG_MODE SPIx4 [current_design]

 

  • 인코더
module encoder(d, en, a, v);
    input[7:0] d ;
    input en ;
    
    output[2:0] a ;
    output v;
    
    reg [2:0] a;
    reg v;
    
    always @ (en or d)
    begin
    a = 0;
    v = 1'b0;
    if (en) begin
        if (d[7]) begin
            a = 7;
            v = 1'b1;
        end else if (d[6]) begin
            a = 6;
            v = 1'b1;
        end else if (d[5]) begin
            a = 5;
            v = 1'b1;
        end else if (d[4]) begin
            a = 4;
            v = 1'b1;
        end else if (d[3]) begin
            a = 3;
            v = 1'b1;
        end else if (d[2]) begin
            a = 2;
            v = 1'b1;
        end else if (d[1]) begin
            a = 1;
            v = 1'b1;
        end else if (d[0]) begin
            a = 0;
            v = 1'b1;
        end else begin
            a = 0;
            v = 1'b0;
        end
    end
end 

endmodule
module encoder_tb;

  reg [7:0] d;
  reg en;
  wire [2:0] a;
  wire v;

  encoder dut (
    .d(d),
    .en(en),
    .a(a),
    .v(v)
  );

  initial begin
    // 인풋 값 설정
    d = 8'b00000000;
    en = 0;
    
    // 인에이블 신호 활성화
    en = 1;
    #10;
    
    // 입력 값 테스트
    d = 8'b00000100;
    #10;
    
    d = 8'b00010000;
    #10;
    
    d = 8'b10000000;
    #10;
    
    // 인에이블 신호 비활성화
    en = 0;
    #10;
    
    $finish;
  end

endmodule

Simultaion

 

RTL ANALYSIS - Schematic

 

SYNTHESIS - Schematic

 

//Basys_3_Master
## Switches
set_property -dict { PACKAGE_PIN V17   IOSTANDARD LVCMOS33 } [get_ports {d[0]}]
set_property -dict { PACKAGE_PIN V16   IOSTANDARD LVCMOS33 } [get_ports {d[1]}]
set_property -dict { PACKAGE_PIN W16   IOSTANDARD LVCMOS33 } [get_ports {d[2]}]
set_property -dict { PACKAGE_PIN W17   IOSTANDARD LVCMOS33 } [get_ports {d[3]}]
set_property -dict { PACKAGE_PIN W15   IOSTANDARD LVCMOS33 } [get_ports {d[4]}]
set_property -dict { PACKAGE_PIN V15   IOSTANDARD LVCMOS33 } [get_ports {d[5]}]
set_property -dict { PACKAGE_PIN W14   IOSTANDARD LVCMOS33 } [get_ports {d[6]}]
set_property -dict { PACKAGE_PIN W13   IOSTANDARD LVCMOS33 } [get_ports {d[7]}]
set_property -dict { PACKAGE_PIN R2    IOSTANDARD LVCMOS33 } [get_ports {en}]

## LEDs
set_property -dict { PACKAGE_PIN U16   IOSTANDARD LVCMOS33 } [get_ports {a[0]}]
set_property -dict { PACKAGE_PIN E19   IOSTANDARD LVCMOS33 } [get_ports {a[1]}]
set_property -dict { PACKAGE_PIN U19   IOSTANDARD LVCMOS33 } [get_ports {a[2]}]
set_property -dict { PACKAGE_PIN V19   IOSTANDARD LVCMOS33 } [get_ports {v}]

 

 

 


 

  • 스위칭 인코더
module sw_encoder(clk, key, keyVal);
    input clk;
    input [15:0] key;
    output [3:0] keyVal;
    
    reg [3:0] keyVal;
    
    always @ (posedge clk)
    begin 
        case(key)
            16'b0000000000000001 : keyVal = 4'b0000;
            16'b0000000000000010 : keyVal = 4'b0001;
            16'b0000000000000100 : keyVal = 4'b0010;
            16'b0000000000001000 : keyVal = 4'b0011;
            16'b0000000000010000 : keyVal = 4'b0100;
            16'b0000000000100000 : keyVal = 4'b0101;
            16'b0000000001000000 : keyVal = 4'b0110;
            16'b0000000010000000 : keyVal = 4'b0111;
            16'b0000000100000000 : keyVal = 4'b1000;
            16'b0000001000000000 : keyVal = 4'b1001;
            16'b0000010000000000 : keyVal = 4'b1010;
            16'b0000100000000000 : keyVal = 4'b1011;
            16'b0001000000000000 : keyVal = 4'b1100;
            16'b0010000000000000 : keyVal = 4'b1101;
            16'b0100000000000000 : keyVal = 4'b1110;
            16'b1000000000000000 : keyVal = 4'b1111;
            default :;
        endcase
    end
endmodule
module sw_encoder_tb1;
  reg clk;
  reg [15:0] key;
  wire [3:0] keyVal;
  
  sw_encoder dut (
    .clk(clk),
    .key(key),
    .keyVal(keyVal)
  );
  
always #5 clk = ~clk;
    
  initial begin
    // 초기화
    clk = 0;
    key = 16'b0000000000000000;
    #5 key = key + 1;
    end
    
    always @ (clk) begin
    
     key <= key << 1'b1;
     #10;
    
     end


endmodule

 

key
keyvalue

## 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 V15   IOSTANDARD LVCMOS33 } [get_ports {key[5]}]
set_property -dict { PACKAGE_PIN W14   IOSTANDARD LVCMOS33 } [get_ports {key[6]}]
set_property -dict { PACKAGE_PIN W13   IOSTANDARD LVCMOS33 } [get_ports {key[7]}]
set_property -dict { PACKAGE_PIN V2    IOSTANDARD LVCMOS33 } [get_ports {key[8]}]
set_property -dict { PACKAGE_PIN T3    IOSTANDARD LVCMOS33 } [get_ports {key[9]}]
set_property -dict { PACKAGE_PIN T2    IOSTANDARD LVCMOS33 } [get_ports {key[10]}]
set_property -dict { PACKAGE_PIN R3    IOSTANDARD LVCMOS33 } [get_ports {key[11]}]
set_property -dict { PACKAGE_PIN W2    IOSTANDARD LVCMOS33 } [get_ports {key[12]}]
set_property -dict { PACKAGE_PIN U1    IOSTANDARD LVCMOS33 } [get_ports {key[13]}]
set_property -dict { PACKAGE_PIN T1    IOSTANDARD LVCMOS33 } [get_ports {key[14]}]
set_property -dict { PACKAGE_PIN R2    IOSTANDARD LVCMOS33 } [get_ports {key[15]}]


## LEDs
set_property -dict { PACKAGE_PIN U16   IOSTANDARD LVCMOS33 } [get_ports {keyVal[0]}]
set_property -dict { PACKAGE_PIN E19   IOSTANDARD LVCMOS33 } [get_ports {keyVal[1]}]
set_property -dict { PACKAGE_PIN U19   IOSTANDARD LVCMOS33 } [get_ports {keyVal[2]}]
set_property -dict { PACKAGE_PIN V19   IOSTANDARD LVCMOS33 } [get_ports {keyVal[3]}]

##Buttons
set_property -dict { PACKAGE_PIN U18   IOSTANDARD LVCMOS33 } [get_ports key[0]]
set_property -dict { PACKAGE_PIN T18   IOSTANDARD LVCMOS33 } [get_ports key[1]]
set_property -dict { PACKAGE_PIN W19   IOSTANDARD LVCMOS33 } [get_ports key[2]]
set_property -dict { PACKAGE_PIN T17   IOSTANDARD LVCMOS33 } [get_ports key[3]]
set_property -dict { PACKAGE_PIN U17   IOSTANDARD LVCMOS33 } [get_ports key[4]]