디지털 시스템 실험
작성자 : 전기전자전파 공학부 □□□ 학번 : ○○○○○○○○○○ 디지털 시스템 실험 KECE210 전기전자전파 공학부 실험조 : ○○조 실험일 :
실험제목	RAM(Random Access Memory)
실험목표	16×4RAM(Random Access Memory)를 설계한다.
실험준비물	Altera Quartus II 4.0 software, HBE-COMBO 보드
배경지식	- RAM(Random Access Memory) 이란? 주기억장치 라고도 하고 임시 기억장치라고도 한다. 전원이 있는동안 임시적으로 데이터를 저장할수 있다. 내부회로가 플립플롭으로 되어있으면 SRAM이라하고, 캐패시터와 MOSFET로 되어있으면 DRAM이라한다. Verilog로 작성되는 RAM은 플립플롭으로 구성하므로 SRAM이라고 할 수 있다. - RAM의 기능 1)Write RAM에 데이터를 저장하는 기능이다. 클럭이 postive edge이고 WE(Write Enable)신호가 있을 때, 주소 신호로 인가된 주소 데이터에 해당하는 RAM 내부 레지스터 주소에 데이터 신호로 인가된 값을 저장하는 기능이다. 2)Read RAM에 저장된 데이터를 읽어오는('out_data'로 출력) 기능이다. 클럭이 postive edge일 때 주소 신호로 인가된 주소 데이터에 해당하는 RAM 내부 레지스터 주소에 저장된 값을 'out_data'로 출력하는 기능이다. Verilog 문법 1) If-else 구문 조건문은 기술된 조건에 따라 다른 문장을 실행할 때 사용합니다. 기본적인 형대는 If-else 형태로 C언어와 같은 방법으로 사용할 수 있습니다. If문만 단독 으로 사용하거나 If - else if와 같은 형태 또는 조건문을 중복하여 사용할 수도 있습니다. 조건문을 중복하여 사용할 경우에는 실행 범위를 begin-end로 정확 하게 명시하는 것이 좋습니다. 범위가 명확하지 않은 경우 오동작을 할 수 있 습니다. 조건식 내에는 다양한 연산자를 사용할 수 있습니다. 2) Always 문 순차회로는 입력 뿐만 아니라 현재 상태에 따라 값이 다르게 나올 수 있는 회로입 니다. 순차회로는 현재 상태를 기억하고 있기 때문에 메모리 소자(Latch 또는 Flip- Flop)를 가지고 있습니다. always문의 타이밍 제어가 이벤트일 경우 Sensitivity List에 해당하는 이벤트가 발생할 경우 아래 순차회로가 실행되게 됩니다. (이벤트가 발생하지 않을 경우 값을 유지) 앞의 예제에서 클럭의 상승에지에서 순차회로가 동작하게 되는데 다음 상태의 count 값은 현재 상태의 count 값에 1을 더한 값이 저장됩니다. 클럭이 발생하는 입력은 같 지만 현재 상태에 따라 출력 값이 다른 순차회로가 됩니다. always 문에서 값을 할당할 수 있는 데이터 형은 레지스터 형입니다. 따라서 좌변에 는 레지스터 형만 올 수 있으며 생략할 수 없습니다. 우변에는 레지스터, Wire, Parameter 형을 모두 사용할 수 있으며 산술.논리.조건 연산식을 사용할 수 있습니다.
실험설계	플립플롭을 여러 개 사용하면, 레지스터를 만들 수 있고, 또 레지스터를 여러개 사용하면 메모리를 만들 수 있다. 이번에는 16×4 RAM 메모리를 설계한다. ◉ 메모리 동작 메커니즘 1. CLK의 상승 메모리에서 WR=1 이면, A3~A0이 지정된 어드레스로 데이터 D_IN3~D_IN0이 저장되게 한다. 2. RD=0 이면, CLK에 관계없이 A3~A0이 지정된 어드레스의 내용이 Q3~Q0으로 출력되게 하고, RD=1 이면 Q3~Q0은 하이 임피던스가 되게 한다. Verilog Code /////////////////////////////////////////////////// // Code for memory /////////////////////////////////////////////////// module memory(CLK,WR,RD,A,D_IN,Q); input CLK, WR, RD; input [3:0] A; // Address input [3:0] D_IN; // Input data output [3:0] Q; // Loaded data reg [3:0] SRAM [15:0]; // 4bit x 16 SRAM // When positive edge // if WR = 1, SRAM[A] = D_IN // Anytime // if RD = 0, Q = SRAM[A] Load 4bit SRAM data at address A // if RD = 1, Q = 4'bz 4bit high impedance endmodule /////////////////////////////////////////////////// PIN number Q[0~3] = LED1~4 A[0~3] = DIP Switch 1~4 D_IN[0~3] = DIP Switch 5~8 WR = Button Swtich 1(*) RD = Button Swtich 2(**) CLK = Clock (PIN_AB11) (*) WR을 누를 때 write on (**) RD를 누를 때 high impedance /////////////////////////////////////////////////// 프로젝트 관련 내용 /////////////////////////////////////////////////// BCD-to-7 segment 구현 1. BCD-to-7 segment 진리표를 채운다. 2. 라인 디코더를 이용하여 4bit 입력과 7bit 출력 2개를 갖는 디코더를 설계한다. 7bit 출력 한 개는 일의 자리를 표현하고 나머지 7bit 출력은 10의 자리를 표현한다. 이 때 라인 디코더에 출력을 선택하여 논리 Gate를 연결하면 7-segment의 a, b, c, d, e ,f, g에 해당하는 논리식을 얻을 수 있고 그 회로를 디코더 출력 단과 연결하면 7-segment 출력 값을 얻을 수 있다. 3. 이에 해당하는 Verilog를 코딩한다. 4. 컴파일 후, 시뮬레이션을 해본다. 5. 모든 모듈이 완성 되었으므로 풀 컴파일 하여 보드에 올려보고 동작하는지 확인한다. 7 segment Controller 구현 (코드제공) 다음의 그림과 같이 7 세그먼트 컨트롤러를 구현한다. oS_COM(SEG_COM)은 각 세그먼트 모듈(숫자 하나)을 켜거나 끄고 HBE-COMBO에서는 0일 때 켜진다. oS_ENS(SEG_DATA)는 7 세그먼트의 각 획(숫자를 구성하는 LED)이다. 원래대로라면 각 숫자모듈 하나당 각 획을 표시하기 위해서는 (a~g) 7개와 (.) 1개의 신호가 필요하다. 8자리의 숫자가 있으므로 숫자의 각 획을 표시하려면 8*8=64 개의 신호선이 필요하게 된다. 하지만, 대부분의 모듈은 한 클럭에 한 개의 숫자만 켜지는 동적인 방법을 사용하므로 클럭마다 8개의 신호(a~g)값을 각 자리에 맞는 값으로 바꾸면 8개의 신호만으로도 모든 숫자를 나타낼 수 있다. module SevenSeg_CTRL( iCLK, nRST, iSEG7, iSEG6, iSEG5, iSEG4, iSEG3, iSEG2, iSEG1, iSEG0, oS_COM, oS_ENS ); // I/O definition------------------------------------------ input iCLK, nRST; input [6:0] iSEG7, iSEG6, iSEG5, iSEG4,iSEG3, iSEG2, iSEG1, iSEG0; output [7:0] oS_COM; output [6:0] oS_ENS; /* a,b,c,d, e,f,g,dp */ reg [7:0] oS_COM; reg [6:0] oS_ENS; integer CNT_SCAN; /* [a] [f] [b] [g] [e] [c] [d] [dp] */ always @(posedge iCLK) begin if (nRST) begin oS_COM <= 8'b00000000; oS_ENS <= 0; CNT_SCAN = 0; end else begin if (CNT_SCAN >= 7) CNT_SCAN = 0; else CNT_SCAN = CNT_SCAN + 1; case (CNT_SCAN) 0 : begin oS_COM <= 8'b11111110; oS_ENS <= iSEG0; end 1 : begin oS_COM <= 8'b11111101; oS_ENS <= iSEG1; end 2 : begin oS_COM <= 8'b11111011; oS_ENS <= iSEG2; end 3 : begin oS_COM <= 8'b11110111; oS_ENS <= iSEG3; end 4 : begin oS_COM <= 8'b11101111; oS_ENS <= iSEG4; end 5 : begin oS_COM <= 8'b11011111; oS_ENS <= iSEG5; end 6 : begin oS_COM <= 8'b10111111; oS_ENS <= iSEG6; end 7 : begin oS_COM <= 8'b01111111; oS_ENS <= iSEG7; end default : begin oS_COM <= 8'b11111111; oS_ENS <= iSEG7; end endcase end end endmodule SevenSeg_CTRL 사용 예제 SevenSeg_CTRL u3(CLK, nRST, {A1,B1,C1,D1,E1,F1,G1},{A2,B2,C2,D2,E2,F2,G2},0,0,0,0,0,0, SEG_COM, SEG_DATA); CLK=클럭(PIN_AB11), nRST=리셋버튼 {A1,B1,C1,D1,E1,F1,G1} = 1의자리 7-segment {A2,B2,C2,D2,E2,F2,G2}= 10의자리 7-segment SEG_COM, SEG_DATA = PIN assigment 표 참조

디지털 시스템 설계 및 실험 KEEE209                                                                 전기전자전파 공학부