slide1
Download
Skip this Video
Download Presentation
조합논리회로 모델링

Loading in 2 Seconds...

play fullscreen
1 / 76

조합논리회로 모델링 - PowerPoint PPT Presentation


  • 354 Views
  • Uploaded on

조합논리회로 모델링. Sun, Hye-Seung. 조합논리회로 모델링. 조합논리회로의 형태와 설계에 사용되는 Verilog 구문. 조합논리회로 모델링. 조합논리회로 모델링 시 유의사항 always 구문 감지신호 목록 (sensitivity list) 에 회로 ( 즉 , always 블록으로 모델링되는 회로 ) 의 입력신호들이 빠짐없이 모두 포함되어야 함 그렇지 않은 경우 ; 합성 전과 합성 후의 시뮬레이션 결과가 다를 수 있음 if 조건문과 case 문

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' 조합논리회로 모델링' - isaiah


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide2
조합논리회로 모델링

조합논리회로의 형태와 설계에 사용되는 Verilog 구문

slide3
조합논리회로 모델링
  • 조합논리회로 모델링 시 유의사항
    • always 구문
      • 감지신호 목록 (sensitivity list)에 회로 (즉, always 블록으로 모델링되는 회로)의 입력신호들이 빠짐없이 모두 포함되어야 함
      • 그렇지 않은 경우; 합성 전과 합성 후의 시뮬레이션 결과가 다를 수 있음
    • if 조건문과 case 문
      • 모든 입력 조건들에 대한 출력값이 명시적으로 지정되어야 함
      • 그렇지 않은 경우;래치가 생성되어 순차논리회로가 될 수 있음
    • 논리 최적화가 용이한 구조와 표현을 사용
      • 최소의 게이트 수와 최소 지연경로를 갖는 회로가 합성되도록 해야 함
    • 소스코드가 간결해지도록 모델링
      • 소스코드의 가독성 (readability)을 좋게 하여 오류 발생 가능성을 줄여 주고, 디버깅을 용이하게 하여 설계 생산성을 높여 줌
10 1 1

a[0]

a[1]

y

a[2]

a[3]

10.1.1기본 논리게이트 모델링
  • 4입력 NAND 게이트

비트 연산자, 축약연산자, 게이트 프리미티브

module nand4_op1(a, y);

input [3:0] a;

output y;

assign y = ~(a[0] & a[1] & a[2] & a[3]); // 비트 연산자

// assign y = ~&a; // 축약 연산자

// nand U0(y, a[0], a[1], a[2], a[3]); // 게이트 프리미티브

endmodule

코드 10.1 ~ 10.3

10 1 11
10.1.1기본 논리게이트 모델링
  • 4입력 NAND 게이트

if 조건문

module nand4_if(a, y);

input [3:0] a;

output y;

reg y;

always @(a) begin

if(a == 4\'b1111) y = 1\'b0;

else y = 1\'b1;

end

endmodule

코드 10.4

10 1 12
10.1.1기본 논리게이트 모델링
  • 4입력 NAND 게이트 (테스트벤치)

module tb_nand4;

reg [3:0] a;

wire y;

integer i;

nand4_op1 U0(a, y);

// nand4_op2 U0(a, y);

// nand4_gate U0(a, y);

// nand4_if U0(a, y);

initial begin

a = 0;

for(i=1; i < 32; i=i+1)

#20 a = i;

end

endmodule

코드 10.5

10 1 13
10.1.1기본 논리게이트 모델링

4입력 NAND 게이트의 시뮬레이션 결과

10 1 14
10.1.1기본 논리게이트 모델링
  • 3입력 NOR 게이트를 아래의 방식으로 모델링하고, 테스트벤치를 작성하여 기능을 검증
    • 비트단위 연산자를 사용하는 방법
    • 축약 연산자를 사용하는 방법
    • 게이트 프리미티브를 사용하는 방법
    • if 조건문을 사용하는 방법
10 1 2

a[3:0]

b[3:0]

y[3]

y[2]

y[1]

y[0]

10.1.2멀티비트 논리연산의 모델링
  • 4비트 2입력 NOR 게이트

비트 연산자

module nor_op(a, b, y);

input [3:0] a, b;

output [3:0] y;

assign y = ~(a | b);

// assign y[0] = ~(a[0] | b[0]);

// assign y[1] = ~(a[1] | b[1]);

// assign y[2] = ~(a[2] | b[2]);

// assign y[3] = ~(a[3] | b[3]);

endmodule

코드 10.6

10 1 21
10.1.2멀티비트 논리연산의 모델링
  • 4비트 2입력 NOR 게이트

for 반복문

module nor_for(a, b, y);

input [3:0] a, b;

output [3:0] y;

reg [3:0] y;

integer i;

always @(a or b) begin

for(i=0; i < 4; i=i+1)

y[i] = ~(a[i] | b[i]);

end

endmodule

게이트 프리미티브 배열

module nor_gate(a, b, y);

input [3:0] a, b;

output [3:0] y;

nor U0 [3:0](y, a, b);

endmodule

코드 10.7

코드 10.8

10 1 22
10.1.2멀티비트 논리연산의 모델링
  • 4비트 2입력 XOR게이트를 아래의 방식으로 모델링하고, 테스트벤치를 작성하여 기능을 검증
    • 비트단위 연산자를 사용하는 방법
    • 게이트 프리미티브를 사용하는 방법
    • for 반복문을 사용하는 방법
10 1 3
10.1.3부울함수의 모델링
  • 부울함수의 모델링

비트 연산자

module comb_gate(a, b, c, d, e, y);

input a, b, c, d, e;

output y;

assign y = ~((a | b) &(c | d) & e);

endmodule

코드 10.10

10 1 4
10.1.4진리표의 모델링
  • 진리표의 모델링

case 문

module booth_enc(xin, y, y2, neg);

input [2:0] xin;

output y, y2, neg;

reg [2:0] tmp;

assign y = tmp[2];

assign y2 = tmp[1];

assign neg = tmp[0];

always @(xin) begin

case(xin)

0 : tmp = 3\'b000;

1,2 : tmp = 3\'b100;

3 : tmp = 3\'b010;

4 : tmp = 3\'b011;

5,6 : tmp = 3\'b101;

7 : tmp = 3\'b001;

endcase

end

endmodule

표 10.2 Booth 인코딩 진리표

코드 10.11

10 1 41
10.1.4진리표의 모델링
  • 진리표의 모델링

테스트벤치

module tb_booth_enc;

reg [2:0] xin;

wire y, y2, neg;

integer i;

booth_enc U0(xin, y, y2, neg);

initial begin

xin = 0;

for(i=1; i < 16; i=i+1)

#20 xin = i;

end

endmodule

코드 10.12

10 1 42
10.1.4진리표의 모델링

시뮬레이션 결과

그림 10.6 코드 10.11의 합성 결과

10 1 43
10.1.4진리표의 모델링
  • 아래의 진리표를 Verilog HDL로 모델링하고, 테스트벤치를 작성하여 기능을 검증

표 10.3 Booth 인코딩 진리표(2)

10 1 5 lookup table
10.1.5 Lookup Table의 모델링
  • Lookup Table
    • 회로 동작에 필요한 많은 양의 고정된 데이터 값을 저장하기 위해 사용되는 조합논리회로 블록
    • 함수를 이용하여 독립된 파일로 모델링되고, 소스코드에서 lookup 테이블 함수를 호출하여 저장된 데이터를 읽어내는 방법을 사용
    • 저장될 데이터들을 case 문으로 표현
      • lookup 테이블의 주소가 case 문의 조건으로 사용
      • n-비트의 주소를 갖는 lookup 테이블은 최대 개의 데이터를 저장
10 1 5 lookup table1
10.1.5 Lookup Table의 모델링
  • Lookup Table의 모델링 (함수 이용)

function [7:0] data_line1;

input [3:0] addr_in;

begin

case(addr_in)

0 : data_line1 = 8\'b0010_0000;

1 : data_line1 = 8\'b0100_0100;

2 : data_line1 = 8\'b0110_1001;

3 : data_line1 = 8\'b0110_0111;

. . . . . .

14 : data_line1 = 8\'b0110_1110;

15 : data_line1 = 8\'b0010_0000;

default : data_line1 = 8\'b0000_0000;

endcase

end

endfunction

코드 10.13

slide19
10.2멀티플렉서
  • 4비트 4:1 멀티플렉서
    • 4개의 4비트 입력 중에서 하나를 선택하여 출력
    • if 조건문, case 문, 조건연산자 등을 이용하여 모델링

module mux41_if(sel, a, b, c, d, y);

input [1:0] sel;

input [3:0] a, b, c, d;

output [3:0] y;

reg [3:0] y;

always @(sel or a or b or c or d) begin

if (sel == 2\'b00) y = a;

else if(sel == 2\'b01) y = b;

else if(sel == 2\'b10) y = c;

else if(sel == 2\'b11) y = d;

else y = 4\'bx;

end

endmodule

if 조건문

코드 10.14

slide20
10.2멀티플렉서 모델링
  • 4비트 4:1 멀티플렉서

module mux41_case(sel, a, b, c, d, y);

input [1:0] sel;

input [3:0] a, b, c, d;

output [3:0] y;

reg [3:0] y;

always @(sel or a or b or c or d) begin

case(sel)

0 : y = a;

1 : y = b;

2 : y = c;

3 : y = d;

default : y = 4\'bx;

endcase

end

endmodule

case 문

코드 10.15

slide21
10.2멀티플렉서 모델링
  • 4비트 4:1 멀티플렉서

module mux41_conop(sel, a, b, c, d, y);

input [1:0] sel;

input [3:0] a, b, c, d;

output [3:0] y;

assign y =(sel == 0) ? a :

(sel == 1) ? b :

(sel == 2) ? c :

(sel == 3) ? d : 4\'bx;

endmodule

조건 연산자

코드 10.16

slide22
10.2멀티플렉서 모델링
  • 4비트 4:1 멀티플렉서

module tb_mux41;

reg [3:0] a, b, c, d;

reg [1:0] sel;

wire [3:0] y;

mux41_if U0(sel, a, b, c, d, y);

// mux41_case U0(sel, a, b, c, d, y);

// mux41_conop U0(sel, a, b, c, d, y);

initial begin

a = 4\'b0001; b = 4\'b0010;

c = 4\'b0100; d = 4\'b1000;

#80 a = 4\'b1100; b = 4\'b0011;

c = 4\'b0110; d = 4\'b1001;

end

initial sel = 2\'b00;

always #20 sel = sel + 1;

endmodule

테스트벤치

코드 10.17

slide23
10.2멀티플렉서 모델링
  • 4비트 4:1 멀티플렉서

시뮬레이션 결과

slide24
10.2멀티플렉서 모델링
  • 4비트 4:1 멀티플렉서

그림 10.8 코드 10.14 ~ 10.16의 합성 결과

slide25

module mux81_case(sel, in_word, out_bit);

input [2:0] sel;

input [7:0] in_word;

output out_bit;

reg out_bit;

always @(sel or in_word) begin

case(sel)

endcase

end

endmodule

case 문

코드를 완성한다.

코드 10.18

10.2멀티플렉서 모델링
  • 8비트 8:1 멀티플렉서
10 3 1 2
10.3.1 2진 인코더
  • n:m 2진 인코더
    • n-비트의 입력을 m-비트의 출력으로 변환(단, n=2m)
    • if 조건문, case 문, for 반복문 등 여러 가지 방법으로 모델링
      • 반복문 ; 입력의 비트 수가 큰 경우 또는 입/력 비트 수를 파라미터화하여 모델링하는 경우에 유용
    • 진리표에 나열된 입력조건 이외의 경우에는 출력에 don’t care 값을 할당하여 최소화된 회로가 합성되도록 함

표 10.4 4:2 2진 인코더의 진리표

10 3 1 21
10.3.1 2진 인코더
  • 4:2 2진 인코더

case 문

module enc_4to2_case(a, y);

input [3:0] a;

output [1:0] y;

reg [1:0] y;

always @(a) begin

casex(a)

4\'b0001 : y = 0;

4\'b0010 : y = 1;

4\'b0100 : y = 2;

4\'b1000 : y = 3;

default : y = 2\'bx;

endcase

end

endmodule

module enc_4to2_if(a, y);

input [3:0] a;

output [1:0] y;

reg [1:0] y;

always @(a) begin

if (a == 4\'b0001) y = 0;

else if(a == 4\'b0010) y = 1;

else if(a == 4\'b0100) y = 2;

else if(a == 4\'b1000) y = 3;

else y = 2\'bx;

end

endmodule

if 조건문

코드 10.19

코드 10.20

10 3 1 22
10.3.1 2진 인코더
  • 4:2 2진 인코더

module enc_4to2_for(a, y);

input [3:0] a;

output [1:0] y;

reg [1:0] y;

reg [3:0] temp;

integer n;

always @(a) begin

temp = 4\'b0001;

y = 2\'bx;

for(n = 0; n < 4; n = n + 1) begin

if(a == temp)

y = n;

temp = temp << 1;

end

end

endmodule

for 반복문

코드 10.21

10 3 1 23
10.3.1 2진 인코더
  • 4:2 2진 인코더

module tb_enc_4to2;

reg [3:0] a;

wire [1:0] y;

enc_4to2_case U0(a, y);

// enc_4to2_if U0(a, y);

// enc_4to2_for U0(a, y);

always begin

a = 4\'b0001;

#20 a = 4\'b0010;

#20 a = 4\'b0100;

#20 a = 4\'b1000;

#20;

end

endmodule

테스트벤치

코드 10.22

10 3 1 24
10.3.1 2진 인코더

코드 10.19의 합성결과

코드 10.20, 코드 10.21의 합성결과

10 3 1 25
10.3.1 2진 인코더
  • enable 신호를 갖는 4:2 이진 인코더를 다음의 방법으로 모델링하고, 시뮬레이션을 통해 검증
    • case 문을 사용하는 방법
    • if 조건문을 사용하는 방법
    • for 반복문을 사용하는 방법
10 3 2
10.3.2우선순위 인코더
  • 4:2 우선순위 인코더

표 10.5 4:2 우선순위 인코더의 진리표

10 3 21
10.3.2우선순위 인코더
  • 4:2 우선순위 인코더

module pri_enc_4to2_if(a, valid, y);

input [3:0] a;

output valid;

output [1:0] y;

reg valid;

reg [1:0] y;

always @(a) begin

valid = 1;

if (a[3]) y = 3;

else if(a[2]) y = 2;

else if(a[1]) y = 1;

else if(a[0]) y = 0;

else begin

valid = 0;

y = 2\'bx;

end

end

endmodule

if 조건문 사용

코드 10.23

10 3 22
10.3.2우선순위 인코더
  • 4:2 우선순위 인코더

module pri_enc_4to2_case(a, valid, y);

input [3:0] a;

output valid;

output [1:0] y;

reg valid;

reg [1:0] y;

always @(a) begin

valid = 1;

casex(a)

4\'b1xxx : y = 3;

4\'b01xx : y = 2;

4\'b001x : y = 1;

4\'b0001 : y = 0;

default : begin

valid = 0;

y = 2\'bx;

end

endcase

end

endmodule

casex 문 사용

코드 10.24

10 3 23
10.3.2우선순위 인코더
  • 4:2 우선순위 인코더

module pri_enc_4to2_for(a, valid, y);

input [3:0] a;

output valid;

output [1:0] y;

reg valid;

reg [1:0] y;

integer n;

always @(a) begin

valid = 0;

y = 2\'bx;

for(n = 0; n < 4; n = n+1)

if(a[n]) begin

valid = 1;

y = n;

end

end

endmodule

for 문 사용

코드 10.25

10 3 24
10.3.2우선순위 인코더
  • 4:2 우선순위 인코더

테스트벤치

module tb_pri_enc;

reg [3:0] a;

wire valid;

wire [1:0] y;

pri_enc_4to2_case U0(a, valid, y);

// pri_enc_4to2_if U0(a, valid, y);

// pri_enc_4to2_for U0(a, valid, y);

always begin

a = 4\'b0001;

#20 a = 4\'b0010;

#20 a = 4\'b0100;

#20 a = 4\'b1000;

#20;

end

endmodule

코드 10.26

10 3 25
10.3.2우선순위 인코더
  • 4:2 우선순위 인코더

시뮬레이션 결과

10 3 26
10.3.2우선순위 인코더
  • 4:2 우선순위 인코더

그림 10.12 코드 10.23 ~ 10.25의 합성 결과

10 3 27
10.3.2우선순위 인코더
  • enable 신호를 갖는 4:2 우선순위 인코더를 다음의 방법으로 모델링하고, 시뮬레이션을 통해 검증
    • case 문을 사용하는 방법
    • if 조건문을 사용하는 방법
    • for 반복문을 사용하는 방법
10 3 3
10.3.3디코더
  • m:n 2진 디코더
    • m-비트의 입력을 n-비트의 출력으로 변환(단, n=2m)
    • n:m 2진 인코더로 인코딩된 데이터를 복원시킴
    • if 조건문, case 문, for 반복문 등 여러 가지 방법으로 모델링
      • 반복문 ; 입력의 비트 수가 큰 경우 또는 입/력 비트 수를 파라미터화하여 모델링하는 경우에 유용

표 10.6 2:4 2진 디코더의 진리표

10 3 31
10.3.3디코더
  • 2:4 이진 디코더

module dec_2to4_if(a, y);

input [1:0] a;

output [3:0] y;

reg [3:0] y;

always @(a) begin

if(a == 0) y = 4\'b0001;

else if(a ==1) y = 4\'b0010;

else if(a ==2) y = 4\'b0100;

else y = 4\'b1000;

end

endmodule

if 조건문 사용

코드 10.27

10 3 32
10.3.3디코더
  • 2:4 이진 디코더

module dec_2to4_case(a, y);

input [1:0] a;

output [3:0] y;

reg [3:0] y;

always @(a) begin

case(a)

0 : y = 4\'b0001;

1 : y = 4\'b0010;

2 : y = 4\'b0100;

3 : y = 4\'b1000;

default: y = 4\'bx;

endcase

end

endmodule

case 문 사용

코드 10.28

10 3 33
10.3.3디코더
  • 2:4 이진 디코더

module dec_2to4_for(a, y);

input [1:0] a;

output [3:0] y;

reg [3:0] y;

integer n;

always @(a) begin

for(n = 0; n <= 3; n = n + 1)

if(a == n)

y[n] = 1\'b1;

else

y[n] = 1\'b0;

end

endmodule

for 문 사용

코드 10.29

10 3 34
10.3.3디코더
  • 2:4 이진 디코더

module tb_dec_2to4;

reg [1:0] a;

wire [3:0] y;

dec_2to4_case U0(a, y);

// dec_2to4_if U0(a, y);

// dec_2to4_for U0(a, y);

always begin

a = 4\'b00;

#20 a = 4\'b01;

#20 a = 4\'b10;

#20 a = 4\'b11;

#20;

end

endmodule

테스트벤치

코드 10.30

10 3 35
10.3.3디코더
  • 2:4 이진 디코더

시뮬레이션 결과

10 3 36
10.3.3디코더
  • 2:4 이진 디코더

그림 10.14 코드 10.27 ~ 10.29의 합성 결과

10 3 37
10.3.3디코더
  • Active-high enable 신호를 갖는 3:6 디코더 (표 10.7)를 다음의 방법으로 모델링하고, 시뮬레이션을 통해 검증
    • if 조건문을 사용하는 방법
    • enable 신호와 입력 a를 결합 연산자 { }로 묶어 case 문의 조건으로 사용하는 방법

표 10.7

10 3 38
10.3.3디코더
  • 파라미터화된 디코더

module dec_param(en, a, y);

parameter in_width = 3, out_width = 8;

input en;

input [in_width-1:0] a;

output [out_width-1:0] y;

reg [out_width-1:0] y;

integer n;

always @(en or a) begin

if(!en)

y = 0;

else

if(a > out_width-1)

for(n = 0; n <= out_width-1; n = n+1)

y[n] = 1\'bx;

else

for(n = 0; n <= out_width-1; n = n+1)

if(a == n)

y[n] = 1\'b1;

else

y[n] = 1\'b0;

end

endmodule

코드 10.31

10 3 39
10.3.3디코더
  • 모듈 dec_param을 이용한 3:6 디코더

module dec_param_inst(en, addr, dec_addr);

input en;

input [2:0] addr;

output [5:0] dec_addr;

// 3:6 디코더 구현

dec_param #(3, 6) decoder_3to6(en, addr, dec_addr);

endmodule

코드 10.32

slide50
10.4비교기
  • 비교기
    • 두 입력의 상대적인 크기를 비교
    • 관계연산자, if 조건문, for 반복문 등 여러 가지 방법으로 모델링
  • 4비트 비교기

module comp_assign(a, b, agtb, altb, aeqb);

input [3:0] a, b;

output altb, agtb, aeqb;

assign altb =(a < b);

assign agtb =(a > b);

assign aeqb =(a == b);

endmodule

코드 10.33

관계연산자 사용

slide51
10.4비교기
  • 4비트 비교기

module comp_if(a, b, agtb, altb, aeqb);

input [3:0] a, b;

output altb, agtb, aeqb;

reg altb, agtb, aeqb;

always @(a or b) begin

altb = 1\'b0;

agtb = 1\'b0;

aeqb = 1\'b0;

if(a == b) aeqb = 1\'b1;

else if(a > b) agtb = 1\'b1;

else altb = 1\'b1;

end

endmodule

if 조건문 사용

코드 10.34

slide52
10.4비교기
  • 4비트 비교기

module comp_for(a, b, agtb, altb, aeqb);

parameter size=4;

input [size-1:0] a, b;

output altb, agtb, aeqb;

reg altb, agtb, aeqb;

integer i;

always @(a or b) begin

altb = 1\'b0;

agtb = 1\'b0;

aeqb = 1\'b1;

for(i = size-1; i > = 0; i=i-1) begin : comp_loop

if(a[i] != b[i]) begin

agtb = a[i];

altb = ~a[i];

aeqb = 0;

disable comp_loop;

end

end

end

endmodule

for 문 사용

코드 10.35

slide53
10.4비교기
  • 4비트 비교기

module tb_comp;

reg [3:0] a, b;

wire agtb, altb, aeqb;

// comp_assign Uo(a, b, agtb, altb, aeqb);

// comp_if Uo(a, b, agtb, altb, aeqb);

comp_for Uo(a, b, agtb, altb, aeqb);

always begin

a = 4\'b0001; b = 4\'b1001;

#20 a = 4\'b0010; b = 4\'b0000;

#20 a = 4\'b1100; b = 4\'b1101;

#20 a = 4\'b1001; b = 4\'b1001;

#20 a = 4\'b0111; b = 4\'b0100;

#20 a = 4\'b1111; b = 4\'b1111;

#20 a = 4\'b1101; b = 4\'b1001;

#20 a = 4\'b0000; b = 4\'b0000;

#20 a = 4\'b1010; b = 4\'b1010;

#20 a = 4\'b0001; b = 4\'b1011;

#20;

end

endmodule

테스트벤치

코드 10.36

slide54
10.4비교기
  • 4비트 비교기

시뮬레이션 결과

slide55
10.4비교기
  • 4비트 비교기

코드 10.33의 합성 결과

slide56
10.4비교기
  • 4비트 비교기

코드 10.34의 합성 결과

slide57
10.4비교기
  • 4비트 비교기

코드 10.35의 합성 결과

10 5 tri state

Circuit

Block-A

data_a

bus_data

enable_a

Circuit

Block-B

data_b

enable_b

10.5 Tri-state 버스
  • 3상태 버스 드라이버
    • 회로의 여러 부분에서 생성된 신호들을 공통 버스를 통해 회로의 다른 부분으로 전송하기 위해 사용
      • 제어신호는 데이터를 버스에 보내거나 또는 데이터 소스를 버스로부터 격리시켜 high impedance 상태로 만듬
    • 조건 연산자 또는 게이트 프리미티브를 사용하여 모델링
10 5 tri state1
10.5 Tri-state 버스
  • 3상태 버스 드라이버

module tristate_conop(in, oe, out);

input in, oe;

output out;

assign out =(oe) ? in : 1\'bz;

endmodule

조건연산자 사용

코드 10.37

module tristate_gate(in, oe, out);

input in, oe;

output out;

bufif1 b1(out, in, oe); // Active-high oe

endmodule

게이트 프리미티브 사용

코드 10.38

10 5 tri state2
10.5 Tri-state 버스
  • 3상태 버스 드라이버

`define PERIOD 20

module tb_tristate;

reg in, oe;

// tristate_gate U0_tristate_1(in, oe, out);

tristate_conop U0_tristate_2(in, oe, out);

initial begin

#0 oe = 1\'b0; in = 1\'b1;

#(`PERIOD) in = 1\'b0;

#(`PERIOD) in = 1\'b1; oe = 1\'b1;

#(`PERIOD) in = 1\'b0;

#(`PERIOD*2) in = 1\'b1;

#(`PERIOD*3) in = 1\'b0;

#(`PERIOD) oe = 1\'b0;

#(`PERIOD*2) in = 1\'b1;

#(`PERIOD) in = 1\'b1;

#(`PERIOD*15) $stop;

end

endmodule

테스트벤치

코드 10.39

10 5 tri state3
10.5 Tri-state 버스
  • 3상태 버스 드라이버

시뮬레이션 결과

10 5 tri state4

rcv

received_data

Circuit

Block

bus_data

send_data

send

10.5 Tri-state 버스
  • 양방향 버스 드라이버
    • 보내기와 받기를 동시에 처리
10 5 tri state5
10.5 Tri-state 버스
  • 양방향 버스 드라이버

module bidir_bus(send, send_data, rcv, received_data, bus_data);

input send, rcv;

input [7:0] send_data;

inout [7:0] bus_data;

output [7:0] received_data;

assign received_data =(rcv) ? bus_data : 8\'bz;

assign bus_data =(send) ? send_data : bus_data;

endmodule

코드 10.40

10 5 tri state6
10.5 Tri-state 버스
  • 양방향 버스 드라이버

‘define PERIOD 20

module tb_bidir_bus;

reg send, rcv;

reg [7:0] send_data;

wire [7:0] received_data, bus_data;

bidir_bus U0(send, send_data, rcv, received_data, bus_data);

initial begin

#0 send = 1\'b0; rcv = 1\'b0; send_data = 8\'h00;

#(‘PERIOD) send_data = 8\'h07;

#(‘PERIOD) send_data = 8\'h15; send = 1\'b1;

#(‘PERIOD) send_data = 8\'hAB;

#(‘PERIOD) send_data = 8\'h34;

#(‘PERIOD) send_data = 8\'h11; send = 1\'b0; rcv = 1\'b1;

#(‘PERIOD*2) send_data = 8\'h21;

#(‘PERIOD) send_data = 8\'h77;

#(‘PERIOD*2) send_data = 8\'h66; send = 1\'b1; rcv = 1\'b1;

#(‘PERIOD) send_data = 8\'h12;

#(‘PERIOD) send_data = 8\'hCF; send = 1\'b0; rcv = 1\'b0;

#(‘PERIOD) send_data = 8\'h89;

#(‘PERIOD) send_data = 8\'h65;

#(‘PERIOD*15) $stop;

end

endmodule

테스트벤치

코드 10.41

10 5 tri state7
10.5 Tri-state 버스
  • 양방향 버스 드라이버

시뮬레이션 결과

10 5 tri state8

Circuit

Block-A

data_a

MUX

bus_data

Circuit

Block-B

data_b

enable_a

enable_b

10.5 Tri-state 버스
  • 그림 10.21의 버스 드라이버를 조건 연산자를 사용하여 모델링하고, 시뮬레이션을 통해 검증 (단, 데이터는 8비트로 설계)

그림 10.21

slide67
10.6원하지 않는 래치의 합성
  • 원하지 않는 래치의 합성
    • case 문에 모든 가능한 case 항목들이 포함되지 않는 경우
    • if 조건문에서 else 블록이 생략되는 경우
  • 순수한 조합논리회로의 합성
    • 모든 가능한 입력 조건들에 대해 출력값을 명시적으로 지정
    • default 값을 지정
slide68
10.6원하지 않는 래치의 합성
  • 래치로 합성되는 case 문의 예

module case_latch(sel, in1, in2, y_out);

input [1:0] sel;

input [3:0] in1, in2;

output [3:0] y_out;

reg [3:0] y_out;

always @(sel or in1 or in2) begin

case(sel)

2\'b10 : y_out = in1;

2\'b01 : y_out = in2;

endcase

end

endmodule

코드 10.42

slide69
10.6원하지 않는 래치의 합성
  • 래치로 합성되는 case 문의 예

코드 10.42의 시뮬레이션 결과

slide70

래치

10.6원하지 않는 래치의 합성
  • 래치로 합성되는 case 문의 예

코드 10.42의 합성 결과

slide71
10.6원하지 않는 래치의 합성
  • 래치로 합성되는 if 문의 예

module if_latch(a, b, y_out);

input a, b;

output [3:0] y_out;

reg [3:0] y_out;

always @(a or b) begin

if (({a, b}) == 2\'b11) y_out = 5;

else if(({a, b}) == 2\'b10) y_out = 2;

else if(({a, b}) == 2\'b01) y_out = 3; // No else block

end

endmodule

코드 10.43

slide72

래치

10.6원하지 않는 래치의 합성
  • 래치로 합성되는 if 문의 예

코드 10.43의 합성 결과

slide73
10.6원하지 않는 래치의 합성
  • case 문에 default 문이 포함된 경우
    • 래치가 합성되지 않음

module case_no_latch1(sel, in1, in2, y_out);

input [1:0] sel, in1, in2;

output [1:0] y_out;

reg [1:0] y_out;

always @(sel or in1 or in2) begin

case(sel)

2\'b10 : y_out = in1;

2\'b01 : y_out = in2;

default : y_out = 2\'bx;

endcase

end

endmodule

코드 10.44

slide74
10.6원하지 않는 래치의 합성
  • case 문에 default 문이 포함된 경우

코드 10.44의 합성 결과

slide75
10.6원하지 않는 래치의 합성
  • case 문이 초기값을 갖는 경우
    • 래치가 합성되지 않음

module case_no_latch2(memce0, memce1, cs, en, addr);

output memce0, memce1, cs;

input en;

input [31:30] addr;

reg memce0, memce1, cs;

always @(addr or en) begin

{memce0, memce1, cs} = 3\'b0; // 초기값을 할당

casez({addr, en})

3\'b101: memce0 = 1\'b1;

3\'b111: memce1 = 1\'b1;

3\'b0?1: cs = 1\'b1;

endcase

end

endmodule

코드 10.45

slide76
10.6원하지 않는 래치의 합성
  • case 문이 초기값을 갖는 경우

코드 10.45의 합성 결과

ad