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

Slides:



Advertisements
Similar presentations
Python Ch.06 RaspberryPi Sejin Oh. Raspberry Pi Python  IDLE(Integrated Development Environment)  라즈베리 파이 배포본들은 일반적으로 파이썬과 파이썬 3 의 IDLE 파 이썬 개발 도구를.
Advertisements

13 강 논리회로 2 과목 전자계산기 구조 강사 이 민 욱. 13 강 논리회로  논리회로 1. 부울 대수 (Boolean Algebra) 에서 사용하는 기본 연산자 ① 논리부정 : NOT ( ` ) 논리부정은 F = NOT A 의 표현을 F =A` 로 표현 ② 논리곱.
 Verilog HDL 로 표현되 는 논리회로는 “module”~”endmodul e” 안에 표현  모든 문장은 세미콜론 (;) 으로 문장을 끝냄 ◦ 단, “end~” 로 시작하는 예약어에는 세미콜론이 없음  Module 이름은 영문자 와 언더바 (_) 로 시작할.
임진수 이현철. 회로 설계 과정 합성 ?  합성 도구가 주어진 HDL 코드를 Library 에 맞춰 회로로 변경시켜주는 과정  모든 코드가 합성되는 것은 아니다 !
Chapter 9. 컴퓨터설계기초 9-1 머리말 9-2 데이터 처리장치 (Datapath)
디지털시스템실험 2주차 고려대학교 전기전자전파공학부.
ARM을 이용한 7 segment LED 제어 Verilog 소스
ASIC의 개요 ASIC(Application Specific Integrated Circuit) 특정 용도 주문형 집적회로
색좌표 변환기의 설계 예 색좌표(Color Space) 색의 수학적인 표현 방법 RGB YIQ, YUV, YCbCr CMYK
제5장 조합논리회로설계(MSI/LSI) 내용 5.1 MSI/LSI 조합논리회로 설계 5.2 이진가산기와 이진감산기
7 조합논리회로 IT CookBook, 디지털 논리회로.
4 컴퓨터에서 활용되는 디지털 논리회로 IT CookBook, 컴퓨터 구조와 원리 2.0.
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
디지털 산술과 연산회로.
디 지 털 공 학 한국폴리텍V대학.
가산기 설계.
제4장 조합논리회로 내용 4.1 조합논리회로 설계 과정 4.2 산술회로 : 가산기(adder)/ 감산기(subtractor)
디지털논리실습 기본 논리 게이트 부울대수 조합회로.
Multiplexer 설계.
Verilog HDL 이론.
디지털 시스템 설계(3).
행위수준 모델링 Sun, Hye-Seung.
오브젝트 플립플롭 IT CookBook, VHDL을 이용한 디지털 회로 입문.
COMPUTER ARCHITECTIRE
6. 조합논리의 기능 6-1 기본 가산기 6-2 병렬 2진 가산기 6-3 비교기 6-4 디코더
순차회로 모델링 Sun, Hye-Seung.
VHDL Design : Barrel Shifter
오브젝트 조합 회로 IT CookBook, VHDL을 이용한 디지털 회로 입문.
Ch2-2. VHDL Basic VHDL lexical element VHDL description
학습 목표 반가산기, 전가산기, 고속가산기의 동작을 이해하고 설계하는 방법을 알아본다.
조합논리회로 모델링 Sun, Hye-Seung.
1장. 디지털 논리 회로 다루는 내용 논리 게이트 부울 대수 조합 논리회로 순차 논리회로.
순차 회로 설계 및 검증 Sun, Hye-Seung.
디지털회로설계_강의안7 10. 인코더와 디코더.
한국방송통신대학교 출석수업 컴퓨터과학과 디지털논리회로 담 당 : 김 룡
LCD 모듈의 특징 LCD 컨트롤러 내장으로 모든 디스플레이 기능을 명령어로 제어 8비트 혹은 4비트로 인터페이스
C#.
VHDL Mealy and Moore model
Device Driver 임베디드 시스템 I.
플립플롭, 카운터, 레지스터 순서회로 플립플롭 카운터 레지스터.
디지털 시스템 2010년 1학기 담당교수: 최선영 연구실: 산학연구관 6층 602 ( )
논리회로 설계 및 실험 3주차.
논리회로 및 실험 조합논리회로 (1) - Adder
연산자 (Operator).
논리회로 설계 및 실험 5주차.
볼링게임 시스템 3조 오지연, 손수경.
디지털회로설계_강의안2 NOR, NAND 게이트 불대수와 드모르강 정리.
안산1대학 제 2 장 디지털 논리회로.
3D 프린팅 프로그래밍 05 – 반복패턴 만들기 강사: 김영준 목원대학교 겸임교수.
가산기 설계.
1. 2진 시스템.
계산기.
제5강 처리 장치 2.
7세그먼트 표시기.
디지털회로설계_강의안5 7. 가산기와 감산기 회로.
회로해석 및 논리회로실험 (정승기 교수님, 김신아 조교님)
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
DEGITAL LOGIC CIRCUIT Term Project – 4 bit ALU.
3. 반/전 가산기, 반/전 감산기 제작 컴퓨터 구조 실습 안내서.
ARM Development Suite v1.2
제11강 PC정비사 1급(필기) Lee Hoon Copyright(c) 2008 LeeHoon All rights reserved.
8장. 연산 장치 Lecture #8.
디지털논리 회로 1차설계 예비보고서 2006 송만성 2007이상진 2007배정준 2007김효진.
16장. 변수, 연산자, 사용자 정의 함수 변수 배열과 객체 연산자 함수.
컴퓨터는 어떻게 덧셈, 뺄셈을 할까? 2011년 10월 5일 정동욱.
아날로그 신호를 디지털 신호로 변환하는 A/D 변환기 A/D 변환 시 고려하여 할 샘플링 주파수 D/A 변환기
논리회로 설계 및 실험 8주차.
                                  6장 엔코드 디코드 회로 10진수와 2진수의 변환 및 표시 4 7 A B C D BCD 변환.
ARM Development Suite v1.2
디 코 더 n비트의 2진 코드를 입력으로 받아들여 최대 2n개의 서로 다른 정보로 바꿔 주는 조합 회로
Presentation transcript:

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

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

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

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

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

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

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

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)

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)

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

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; always @ (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

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

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)

모듈 파라미터 변경을 이용한 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 1 2 3 4 5 6 7 8 cin cout

모듈 파라미터 변경을 이용한 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-비트 가산/감산기

모듈 파라미터 변경을 이용한 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비트 가산과 감산을 선택적으로 연산하도록 설계

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

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

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; always @(enc_in) 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

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이 출력되도록 한다.

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

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 1 2 3 4 5 6 7 8

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 0000 0001 001 0000 0010 010 0000 0100 011 0000 1000 100 0001 0000 101 0010 0000 110 0100 0000 111 1000 0000 3:8 이진 디코더

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; always @(dec_in) 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

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을 할당

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

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

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 0011 1111 0001 0000 0110 1 0010 0101 1011 2 0011 0100 1111 3 0100 0110 0110 4 0101 0110 1101 5 0110 0111 1101 6 0111 0000 0111 7 1000 0111 1111 8 1001 0110 0111 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]

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에 할당하는 구문

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

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

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; always @(op_a 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을 출력 * 산술연산에서 발생되는 캐리출력은 무시한다.

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

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 1 2 3 4 5 6 7 8 op_b[3:0] inst[3:0]

좌/우 시프트 기능이 추가된 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

좌/우 시프트 기능이 추가된 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; always @(op_a 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을 만든다.

좌/우 시프트 기능이 추가된 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 1 2 3 4 5 6 7 8 op_b[3:0] inst[5:0]

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 회로

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비트씩 시프트시킨다.

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로 정의

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로 변환한다.

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

cnt_one_segdis 회로 cnt_one_segdis 동작 확인 7-segment Array BUS SW 1 1 2 3 4 5 6 7 8 data_word[7:0] seg_data[7:0] 7-segment Array seg_com[7:0]