Presentation is loading. Please wait.

Presentation is loading. Please wait.

조합 논리회로 설계 및 검증 Sun, Hye-Seung.

Similar presentations


Presentation on theme: "조합 논리회로 설계 및 검증 Sun, Hye-Seung."— Presentation transcript:

1 조합 논리회로 설계 및 검증 Sun, Hye-Seung

2 반가산기(Half Adder) 반가산기 진리표 a b cout sum 1 소스코드 15_2 a b sum cout 반가산기

3 1비트 전가산기 전가산기 진리표 a b cin cout sum 1

4 1비트 전가산기 반가산기 반가산기 모듈을 이용한 전가산기 a b cin s1 c1 c2 sum cout a b sum cout
Half Adder a b sum cout cin s1 c1 c2 반가산기 모듈을 이용한 전가산기

5 1비트 전가산기 HDL Modeling 소스코드 15_2
module fa_assign (a, b, cin, sum, cout); input a, b, cin; output sum, cout; // assign 문을 사용한 모델링 assign s1 = a ^ b; assign c1 = a & b; assign c2 = s1 & cin; assign sum = s1 ^ cin; assign cout = c1 ^ c2; endmodule 소스코드 15_2 코드 15.10

6 1비트 전가산기 동작 확인 fa b a LED Array cin sum cout c

7 1비트 전감산기(Full Subtractor)
반감산기(half subtractor)와 전감산기의 진리표 반 감산기 진리표 전감산기 진리표 a b borrow sub 1 a b bin borrow sub 1

8 1비트 전감산기 소스코드 Ex_15_2_1 HDL Modeling
module fs_?? (a, b, bin, sub, borrow); input a, b, bin; output sub, borrow; endmodule ① 게이트 프리미티브를 사용하여 코드를 완성(fs_primitive) ② assign 구문을 사용하여 코드를 완성(fs_assign) ③ if 조건문을 사용하여 코드를 완성(fs_if) ④ case 문을 사용하여 코드를 완성(fs_case) ⑤ 반감산기 모듈(hs)을 설계하고, 인스턴스 하여 코드를 완성 (fs_hs_instance)

9 Parameter를 이용한 multi-bit 가산기
전가산기의 입력 a와 b, 출력 sum의 비트 수를 parameter N으로 선언하여 N-비트 ripple-carry adder(RCA)를 설계 b[0] a[0] sum[0] b[1] a[1] sum[1] b[N-1] a[N-1] sum[N-1] cout full adder cin Add_Nb N-비트 ripple-carry adder(RCA)

10 Parameter를 이용한 multi-bit 가산기
cin cout sum a b p sum = a  b  cin = p  cin cout = a · b + a · cin + b · cin = !p · a + p · cin 1비트 전가산기의 부울 식 1비트 전가산기

11 Parameter를 이용한 multi-bit 가산기
module add_Nb (a, b, cin, sum, cout); parameter N=1; input [N-1:0] a, b; input cin; output [N-1:0] sum; output cout; reg [N-1:0] sum; reg [N-1:0] p; reg [N:0] carry; integer i; (a or b or cin) begin carry[0] = cin for (i=0; i<N; i=i+1) begin end // END of for end // END of always assign cout = carry[N]; endmodule 소스코드 Ex_15_3_1 그림 15.11(b)의 회로를 참고하여 다음과 같이 코딩. ∙ 연산자 ^를 이용하여 p[i], sum[i]를 구현 ∙ case 문을 이용한 MUX로 carry[i+1]을 구현 코드 15.17

12 Parameter를 이용한 multi-bit 가산기
동작 확인 add_Nb b a LED Array cin sum cout c

13 8-비트 ripple-carry adder(RCA)
모듈 파라미터 변경을 이용한 8비트 가산기 설계 코드 15.17에서 설계된 add_Nb 모듈의 parameter N을 8로 변경하여 8-비트 RCA를 설계 b[0] a[0] sum[0] b[1] a[1] sum[1] b[7] a[7] sum[7] cout full adder 8-비트 ripple-carry adder(RCA)

14 모듈 파라미터 변경을 이용한 8비트 가산기 설계 add_8b 소스코드 Ex_15_3_1
module add_8b (a, b, sum, cout); parameter N=8; input [7:0] a, b; output [7:0] sum; output cout; endmodule 설계된 add_Nb 모듈(코드 15.17)을 인스턴스하고, parameter overriding을 통해 8비트 가산기를 구현한다. *가산기의 캐리입력(cin)은 0으로 한다. add_8b sum[7:0] LED Array a[7:0] b[7:0] BUS SW 1 BUS SW 2 cin cout

15 모듈 파라미터 변경을 이용한 8비트 가/감산기 코드 15.17에서 설계된 add_Nb 모듈의 parameter N을 8로 변경하여 8-비트 가산/감산기를 설계 mode 신호에 따라 가산(mode=0)과 감산(mode=1)을 선택적으로 연산 b[0] a[0] sum[0] sum[1] sum[7] cout full adder mode b[1] a[1] b[7] a[7] 8-b RCA 8-비트 가산/감산기

16 모듈 파라미터 변경을 이용한 8비트 가/감산기 소스코드 Ex_15_3_2
module add_sub_8b (a, b, mode, sum, cout); parameter N=8; input [7:0] a, b; input mode; output [7:0] sum; output cout; endmodule 15.3.1에서 설계된 add_Nb 모듈(코드 15.17)을 인스턴스하고, parameter overriding을 통해 8비트 RCA를 설계한다. * mode 신호에 따라 8비트 가산과 감산을 선택적으로 연산하도록 설계

17 모듈 파라미터 변경을 이용한 8비트 가/감산기 add_sub_8b LED Array sum[7:0] mode cout
BUS SW 1 BUS SW 2 mode cout

18 8:3 이진 인코더 8:3 이진 인코더를 다음의 3가지 방법으로 설계 case 문을 사용하는 방법 if 조건문을 사용하는 방법
for 반복문을 사용하는 방법 8:3 이진 인코더 진리표 인코더 입력(enc_in) 인코더 출력(enc_out) 000 001 010 011 100 101 110 111 Binary Encoder enc_in[7:0] enc_out[2:0] 8:3 이진 인코더

19 8:3 이진 인코더 소스코드 15_5 module enc_8to3_case (enc_in, enc_out);
input [7:0] enc_in; output [2:0] enc_out; reg [2:0] enc_out; begin case (enc_in) 8'h01 : enc_out = 0; 8'h02 : enc_out = 1; 8'h04 : enc_out = 2; 8'h08 : enc_out = 3; 8'h10 : enc_out = 4; 8'h20 : enc_out = 5; 8'h40 : enc_out = 6; 8'h80 : enc_out = 7; default : enc_out = 3'b000; endcase end endmodule 소스코드 15_5

20 8:3 이진 인코더 소스코드 15_5 module enc_8to3_if (enc_in, enc_out);
input [7:0] enc_in; output [2:0] enc_out; endmodule 소스코드 15_5 ▪ if 조건문을 사용하여 코드를 완성한다. ∙ 표 15.20에 나열된 입력조건 이외에는 000이 출력되도록 한다. module enc_8to3_for (enc_in, enc_out); input [7:0] enc_in; output [2:0] enc_out; endmodule ▪ for 반복문을 사용하여 코드를 완성한다. ∙ 반복문 시작 전에 temp=8'b0000_0001의 초기값을 설정 ∙ enc_in의 비트 수 만큼 반복하는 for 루프 ∙ 반복루프 내부에서 * if(enc_in == temp)를 판단하여 enc_out=i * temp를 왼쪽으로 1비트씩 시프트 ▪ 표 15.20에 나열된 입력조건 이외에는 000이 출력되도록 한다.

21 8:3 이진 인코더 기능 검증 테스트벤치 작성 시뮬레이션 시뮬레이션 결과

22 8:3 이진 인코더 enc_8to3 LED Array BUS SW 1 enc_out[2:0] 1 2 3 4 5 6 7 8
enc_in[7:0] BUS SW 1

23 3:8 이진 디코더 3:8 이진 디코더를 다음의 3가지 방법으로 설계 if 조건문을 사용하는 방법
case 조건문을 사용하는 방법 for 반복문을 사용하는 방법 3:8 이진 디코더 진리표 Binary Decoder dec_in[2:0] dec_out[7:0] 디코더 입력(dec_in) 디코더 출력(dec_out) 000 001 010 011 100 101 110 111 3:8 이진 디코더

24 3:8 이진 디코더 소스코드 15_6 module dec_3to8_if (dec_in, dec_out);
소스코드 15_6 module dec_3to8_if (dec_in, dec_out); input [2:0] dec_in; output [7:0] dec_out; reg [7:0] dec_out; begin if (dec_in == 0) dec_out = 8'h01; else if(dec_in == 1) dec_out = 8'h02; else if(dec_in == 2) dec_out = 8'h04; else if(dec_in == 3) dec_out = 8'h08; else if(dec_in == 4) dec_out = 8'h10; else if(dec_in == 5) dec_out = 8'h20; else if(dec_in == 6) dec_out = 8'h40; else dec_out = 8'h80; end endmodule

25 3:8 이진 디코더 소스코드 15_6 module dec_3to8_case (dec_in, dec_out);
소스코드 15_6 module dec_3to8_case (dec_in, dec_out); input [2:0] dec_in; output [7:0] dec_out; reg [7:0] dec_out; endmodule ▪ case 문을 사용하여 코드를 완성한다. module dec_3to8_for (dec_in, dec_out); input [2:0] dec_in; output [7:0] dec_out; reg [7:0] dec_out; endmodule ▪ for 반복문을 사용하여 코드를 완성한다. ∙ dec_out의 비트 수 만큼 반복하는 for 루프 ∙ 반복루프 내부에서 if(dec_in == i)를 판단하여 dec_out[i]에 1 또는 0을 할당

26 3:8 이진 디코더 기능 검증 테스트벤치 작성 시뮬레이션 시뮬레이션 결과

27 3:8 이진 디코더 동작 확인 dec_3to8 LED Array BUS SW 1 dec_out[7:0]
dec_in[2:0] BUS SW 1

28 BCD to 7-Segment 디코더 BCD-to-7-seg 디코더 진리표 BCD-to-7-Segment Decoder a f
bcd_in[3:0] seg_data[7:0] seg_com[7:0] BCD-to-7-seg 디코더 진리표 bcd_in seg_data(hgfe_dcba) 디스플레이 값 0000 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 a b c f e g d h a=seg_data[0] b=seg_data[1] c=seg_data[2] d=seg_data[3] e=seg_data[4] f =seg_data[5] g=seg_data[6] h=seg_data[7]

29 BCD to 7-Segment 디코더 소스코드 Ex_15_6_2
module bcd_seg_dec (bcd_in, seg_data, seg_com); input [3:0] bcd_in; output [7:0] seg_com; output [7:0] seg_data; assign seg_com=8'b0111_1111; endmodule ▪ 앞 진리표를 구현하는 함수 bcd_to_seg를 정의한다. ∙ 함수 내부에 if 조건문 또는 case 문을 사용하여 코딩한다. ▪ 함수 bcd_to_seg를 호출하여 seg_data에 할당하는 구문

30 BCD to 7-Segment 디코더 기능 검증 동작 확인 bcd_seg_dec 테스트벤치 작성 시뮬레이션
seg_data[7:0] bcd_in[3:0] BUS SW 1 7-segment Array seg_com[7:0] 동작 확인

31 4비트 ALU 4비트 ALU (Arithmetic & Logic Unit) inst[3]=0이면 논리연산을 수행
0000 4'b0000 0001 4'b1111 (saturation) 0010 a AND b 0011 a NAND b 0100 a OR b 0101 a NOR b 0110 a XOR b 0111 a XNOR b 산술연산 1000 a 1001 NOT a 1010 a+1 1011 a-1 1100 a+b 1101 a-b op_a[3:0] alu_out[3:0] op_b[3:0] inst[3:0] 4비트 ALU

32 4비트 ALU 소스코드 15_7 module alu_4b (op_a, op_b, inst, alu_out);
input [3:0] op_a, op_b; input [3:0] inst; output [3:0] alu_out; reg [3:0] logic_out, arith_out, alu_out; or op_b or inst) begin endmodule 소스코드 15_7 ▪ 다음과 같이 코딩한다. ∙ case(inst[2:1])로 4가지 논리연산(zero, AND, OR, XOR)을 구현하여 logic_out 생성 ∙ case(inst[2:0])로 6가지 산술연산을 구현하여 arith_out 생성 ∙ case(inst[3])으로 logic_out 또는 arith_out을 선택하여 alu_out 생성 단, 논리연산의 경우에는 if(inst[0]) 조건문으로 반전 관계를 구현 * 정의되지 않은 명령어 값의 경우에는 alu_out=0000을 출력 * 산술연산에서 발생되는 캐리출력은 무시한다.

33 4비트 ALU 기능 검증 테스트벤치 작성 시뮬레이션 시뮬레이션 결과

34 4비트 ALU alu_4b 동작 확인 LED Array BUS SW 1 BUS SW 2 alu_out[3:0]
op_a[3:0] BUS SW 1 BUS SW 2 op_b[3:0] inst[3:0]

35 좌/우 시프트 기능이 추가된 4비트 ALU 4비트 ALU 명령어 op_a[3:0] alu_out[4:0] op_b[3:0]
논리연산 xx0000 5'b00000 xx0001 5'b11111 (saturation) xx0010 a AND b xx0011 a NAND b xx0100 a OR b xx0101 a NOR b xx0110 a XOR b xx0111 a XNOR b 산술연산 xx1000 a xx1001 NOT a xx1010 a+1 xx1011 a-1 xx1100 a+b xx1101 a-b 시프트 연산 00xxxx 논리ㆍ산술연산 결과를 좌로 1비트 시프트 01xxxx 논리ㆍ산술연산 결과를 우로 1비트 시프트 10xxxx No Shift 11xxxx 4비트 ALU 명령어 op_a[3:0] alu_out[4:0] op_b[3:0] inst[5:0] 4비트 ALU

36 좌/우 시프트 기능이 추가된 4비트 ALU 소스코드 Ex_15_7_1
module alu_4b_sh (op_a, op_b, inst, alu_out); input [3:0] op_a, op_b; input [5:0] inst; output [4:0] alu_out; reg [4:0] alu_out; reg [4:0] logic_out, arith_out, mux_out; or op_b or inst) begin // Logic & Arithmetic operations //Shift operations end // END of always endmodule 소스코드 Ex_15_7_1 ▪ 다음과 같이 코딩한다. ∙ case (inst[2:1])로 4가지 논리연산(zero, AND, OR, XOR)을 구현하여 logic_out을 생성 ∙ case (inst[2:0])으로 6가지 산술연산을 구현하여 arith_out을 생성 ∙ case (inst[3])으로 logic_out과 arith_out을 선택하여 mux_out을 생성 단, 논리연산의 경우에는 if (inst[0]) 조건문으로 반전 관계를 구현 * 정의되지 않은 명령어 값의 경우에는 alu_out=00000을 출력 ▪ case (inst[5:4])를 사용하여 mux_out이 시프트된 alu_out을 만든다.

37 좌/우 시프트 기능이 추가된 4비트 ALU alu_4b_sh 동작 확인 LED Array BUS SW 1 BUS SW 2
alu_out[4:0] LED Array op_a[3:0] BUS SW 1 BUS SW 2 op_b[3:0] inst[5:0]

38 cnt_one_segdis 회로 cnt_one_segdis 회로
8비트 입력 data_word에 포함된 1의 개수를 계수하여 7-segment에 10진수로 표시하는 회로 data_word[7:0] cnt_one[3:0] count_ones (task) seg_data[7:0] bcd_to_seg (function) seg_com[7:0] cnt_one_segdis 회로

39 8비트 입력 data_word에 포함된 1의 개수를 찾는 task conut_ones를 정의
cnt_one_segdis 회로 8비트 입력 data_word에 포함된 1의 개수를 찾는 task conut_ones를 정의 task count_ones; input [7:0] data_word; output [3:0] count; begin end endtask 소스코드 15_8 ▪ 입력 data_word를 temp_reg로 치환하고, count=0으로 초기화. ▪ while(count < 9 && temp_reg) 반복문 내부에서 ∙ temp_reg[7]=1이면 count를 1씩 증가시킨다. ∙ temp_reg를 왼쪽으로 1비트씩 시프트시킨다.

40 BCD to 7-Segment 디코더를 function bcd_to_seg로 정의
cnt_one_segdis 회로 소스코드 15_8 BCD to 7-Segment 디코더를 function bcd_to_seg로 정의 function [7:0] bcd_to_seg; input [3:0] bcd_in; begin end endfunction ▪ BCD to 7-Segment 디코더를 함수 bcd_to_seg로 정의

41 cnt_one_segdis 회로 소스코드 15_8
소스코드 15_8 module cnt_one_segdis (data_word, seg_com, seg_data); input [7:0] data_word; output [7:0] seg_com output [7:0] seg_data; assign seg_com=8'b0111_1111; endmodule ▪ 컴파일러 지시어를 이용하여 task count_ones.v를 include시킨다. ▪ 컴파일러 지시어를 이용하여 함수 bcd_to_seg.v를 include시킨다. ▪ always 문에서 ∙ task count_ones를 호출하여 결과값을 cnt_one으로 받는다. ∙ 함수 bcd_to_seg를 호출하여 cnt_one을 seg_data로 변환한다.

42 cnt_one_segdis 회로 기능 검증 테스트벤치 작성 시뮬레이션 시뮬레이션 결과

43 cnt_one_segdis 회로 cnt_one_segdis 동작 확인 7-segment Array BUS SW 1
data_word[7:0] seg_data[7:0] 7-segment Array seg_com[7:0]


Download ppt "조합 논리회로 설계 및 검증 Sun, Hye-Seung."

Similar presentations


Ads by Google