ARM을 이용한 7 segment LED 제어 Verilog 소스

Slides:



Advertisements
Similar presentations
Hankuk University of Foreign Studies Design and Verification Using FPGA Board Part I.
Advertisements

을지대학교 무선 네트워크 사용 방법 2010 년 06 월 01 일. 을지대학교 무선 네트워크 사용 방법 1. PC 무선랜 카드 활성화 및 체크 1 단계 : 시작 -> 설정 -> 네트워크 설정 2 단계 : 무선 네트워크 설정 선택 -> 마우스 버튼 오른쪽 클릭 -> 사용.
임진수 이현철. 회로 설계 과정 합성 ?  합성 도구가 주어진 HDL 코드를 Library 에 맞춰 회로로 변경시켜주는 과정  모든 코드가 합성되는 것은 아니다 !
디지털시스템실험 2주차 고려대학교 전기전자전파공학부.
패러럴 포트를 이용한 Text LCD 제어 6월 17일 허정수 나선웅.
인터럽트 종류 인터럽트 요구시 I/O장치 인식 방법
AMBA BUS Protocol의 이해 (AMBA 2.0 Specification)
7 – 세그먼트 동작 시키기 (0~9, A, B, C, D, E, F 표시하기)
디지털 시계 설계.
2장 마이크로프로세서 구성요소 Slide 1 (of 19).
4장 마이크로프로세서 외부 신호 Slide 1 (of 22).
6장 마이크로프로세서 메모리 및 입출력장치 인터페이스.
마이크로프로세서 메모리 및 입출력장치 인터페이스
Design of Digital Clock (디지털 시계의 설계)
UNIT 15 Timer & Watch Dog 로봇 SW 교육원 조용수.
조합 논리회로 설계 및 검증 Sun, Hye-Seung.
10장 주변장치 (PIO) Slide 1 (of 28).
Multiplexer 설계.
Verilog HDL 이론.
디지털 시스템 설계(3).
VHDL Description D-latch C=1 일 때 Q 는 D의 입력 값 이 전달된다.
신호등 제어기 차량의 흐름에 따라 신호등의 신호를 제어하는 장치 신호등 제어기의 입출력 신호
PXA255-FPGA 장비 개요 및 실습 Lecture #9.
PXA255-FPGA 장비 계요 및 실습 Lecture #9.
어셈블리 문법 보강 4월 10일.
순차회로 모델링 Sun, Hye-Seung.
VHDL Design : Barrel Shifter
Text LCD control.
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
존슨카운터의 동작을 설명·설계할 수 있다 링카운터의 동작을 설명·설계할 수 있다
조합논리회로 모델링 Sun, Hye-Seung.
순차 회로 설계 및 검증 Sun, Hye-Seung.
Error Detection and Correction
DK-128 ADC 실습 아이티즌 기술연구소
WinCE Device Driver 실습 #2
LCD 모듈의 특징 LCD 컨트롤러 내장으로 모든 디스플레이 기능을 명령어로 제어 8비트 혹은 4비트로 인터페이스
DK-128 실습 EEPROM 제어 아이티즌 기술연구소
타이머카운터 사용법 휴먼네트웍스 기술연구소
ATmega128 FND 실습 휴먼네트웍스 기술연구소
DK-128 FND 실습 아이티즌 기술연구소 김태성 연구원
Microprocessor I/O Port & CLCD Noh Jin-Seok.
과제#4 내용 정성훈.
VHDL Mealy and Moore model
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
RPi2 SPI 8x8 Dot Matrix LED
LCD Controller Colorbar
플립플롭, 카운터, 레지스터 순서회로 플립플롭 카운터 레지스터.
DK-128 FND 실습 아이티즌 기술연구소
USN(Ubiquitous Sensor Network)
논리회로 설계 및 실험 5주차.
DK-128 실습 내부 EEPROM 제어 아이티즌 기술연구소 김태성 연구원
DK-128 실습 타이머카운터 사용법 아이티즌 기술연구소
패러럴 포트를 이용한 Text LCD 제어 6월 17일 허정수 나선웅.
제4강 처리장치 1.
13장 CTC and DMA Slide 1 (of 10).
클라우드 서버로 부터 값 읽어오기 WiFi 시리얼 보드 활용가이드 김영준 헬로앱스 (
UNIT 25 SPI 로봇 SW 교육원 조용수.
웹서버 기능으로 데이터 읽기 및 제어하기 WiFi 시리얼 보드 활용가이드 김영준
컴퓨터 계측 및 실습 디지털 출력 영남대학교 기계공학부.
계산기.
RAM RAM 읽기 동작(read) RAM 쓰기 동작(write) 1. 주소선을 통해 주소값 입력.
DK-128 직렬통신 실습 아이티즌 기술연구소
UNIT 25 SPI 로봇 SW 교육원 조용수.
논리회로 설계 및 실험 4주차.
TVM ver 최종보고서
AdcRead API 함수 분석 마이크로프로세서.
버스와 메모리 전송 버스 시스템 레지스터와 레지스터들 사이의 정보 전송을 위한 경로
논리회로 설계 및 실험 8주차.
디 코 더 n비트의 2진 코드를 입력으로 받아들여 최대 2n개의 서로 다른 정보로 바꿔 주는 조합 회로
Progress Seminar 양승만.
Presentation transcript:

ARM을 이용한 7 segment LED 제어 Verilog 소스 한성대학교 전자정보공학과 이종복

코드의 구성 [1] 코어 인터페이스 [2] AMBA Bus 선언 Design_top.v AMBA AHB address decoding 수행 IP 추가에 따른 모듈 선언 및 네트 연결 프로젝트 내의 모든 모듈이 선언됨 [2] AMBA Bus 선언 Ahb_matrix_m4s10r_rec.vqm : AHB Matrix 선언 Ahb2ahb_sync_rec.vqm : AHB2AHB 선언 Ahb2apb_p8_rec.vqm : APB Bridge 선언 Ahb_dummy_master_rec.v : AHB dummy master 선언 Ahb_dummy_slave_rec.v : AHB dummy slave 선언 Apb_dummu_slave_rec.v : APB dummy slave 선언

[3] APB Design File Seven_seg.v : 7-Segment IP Apb_seg_led.v : LED IP Address Decoder에 의한 LED/7-Segment 선택 후 PWDATA 및 PRDATA 전송 Apb_seg_led_rec.v Apb_seg_led.v 모듈선언 AMBA APB 네트와 연결

[1] module design_top ( hclk, hresetn, dma_req, dma_clr, dma_tc, iint, mas_hlock, mas_hbusreq, mas_hready, mas_hgrant, slave_hdata, slave_hresp, slave_hreadyout, slave_hsplit, slave_haddr, slave_hsize, slave_hwrite, slave_hburst, slave_htrans, slave_hprot, slave_hsel, slave_hreadyin, slave_hmaster, slave_hmastlock, segout, segcom, led ); input hclk; input hresetn;

// AHB Master Signal // output mas_hlock; Arbiter로 output mas_hbusreq; Arbiter로 input mas_hready; Slave로부터 input mas_hgrant; Slave로부터 // AHB Slave Signal : ARM Core interface inout[31:0] slave_hdata; output[1:0] slave_hresp; output slave_hreadyout; output[15:0] slave_hsplit; input[31:0] slave_haddr; input[2:0] slave_hsize; input slave_hwrite; input[2:0] slave_hburst; input[1:0] slave_htrans; % ARM코어로 전달하기 위하여 출력으로 내보냄 % ARM코어로부터 받는 신호들

input[3:0] slave_hprot; input slave_hsel; input slave_hreadyin; input[3:0] slave_hmaster; input slave_hmastlock; // // 7-Segment / LED port output[7:0] segout; output[7:0] segcom; output[7:0] led; wire[3:0] dma_req; wire[3:0] iint; wire mas_hlock; wire mas_hbusreq; % ARM코어로부터 받는 신호들 % 7세그멘트와 LED로 보내는 출력신호

wire[31:0] slave_hrdata; wire[31:0] slave_hwdata; wire[1:0] slave_hresp; wire slave_hreadyout; wire[15:0] slave_hsplit; wire[31:0] sub_decaddr; reg[3:0] sub_hslaveid; // // AHB Master / Slave internal siganl wire[35:0] sig_ahb_m0_in; wire[35:0] sig_ahb_m1_in; wire[35:0] sig_ahb_m2_in; wire[35:0] sig_ahb_m3_in; wire[78:0] sig_ahb_m0_out; wire[78:0] sig_ahb_m1_out; % hready(1b), hresp(2b),hrdata(32b),hgrant(1b) ∴ total 36 bit Slave에서 Master로 보내는 데이터+제어신호 % Master는 4개이므로 m0,m1,m2,m3

wire[78:0] sig_ahb_m2_out; wire[78:0] sig_ahb_m3_out; % ahb는 s0~s9까지 10개임. % hlock 1 htrans 2 haddr 32 hwrite 1 hsize 3 hburst 3 hprot 4 hwdata 32 hbusreq 1 ∴ total 79 bit (Master에서 Arbiter로 가는 주소,데이터,제어신호들) wire[78:0] sig_ahb_m2_out; wire[78:0] sig_ahb_m3_out; wire[83:0] sig_ahb_s0_in; wire[83:0] sig_ahb_s1_in; wire[83:0] sig_ahb_s2_in; wire[83:0] sig_ahb_s3_in; wire[83:0] sig_ahb_s4_in; wire[83:0] sig_ahb_s5_in; wire[83:0] sig_ahb_s6_in; wire[83:0] sig_ahb_s7_in; wire[83:0] sig_ahb_s8_in; wire[83:0] sig_ahb_s9_in; wire[50:0] sig_ahb_s0_out; wire[50:0] sig_ahb_s1_out; wire[50:0] sig_ahb_s2_out; wire[50:0] sig_ahb_s3_out; wire[50:0] sig_ahb_s4_out; wire[50:0] sig_ahb_s5_out; wire[50:0] sig_ahb_s6_out; wire[50:0] sig_ahb_s7_out; wire[50:0] sig_ahb_s8_out; % hlock 1 htrans 2 haddr 32 hwrite 1 hsize 3 hburst 3 hprot 4 hwdata 32 hsel 1 hmasterid 4 hreadyin : 1 ∴ total 84 bit (Arbiter에서 Slave로 가는 주소,데이터, 제어신호들)

wire[50:0] sig_ahb_s9_out; reg ibidir_en_hdata; // // APB internal signal wire[66:0] sig_apb_s0_in; wire[31:0] sig_apb_s0_out; wire[66:0] sig_apb_s1_in; wire[31:0] sig_apb_s1_out; wire[66:0] sig_apb_s2_in; wire[31:0] sig_apb_s2_out; wire[66:0] sig_apb_s3_in; wire[31:0] sig_apb_s3_out; wire[66:0] sig_apb_s4_in; wire[31:0] sig_apb_s4_out; wire[66:0] sig_apb_s5_in; wire[31:0] sig_apb_s5_out; % psel 1 penable 1 paddr 32 pwrite 1 pwdata 32 ∴ Total 67 bit (APB 브릿지에서 APB Slave로 가는 주소, 쓰기데이터, 제어신호들 % prdata 32 bit APB Slave로부터 오는 데이터 % apb는 s0~s7까지 8개

wire[66:0] sig_apb_s6_in; wire[31:0] sig_apb_s6_out; wire[66:0] sig_apb_s7_in; wire[31:0] sig_apb_s7_out; // // APB Text-LCD/7-Seg/LED wire[7:0] segout; wire[7:0] segcom; wire[7:0] led; // default set assign dma_req = 4'b0000; assign iint = 4'b0000; assign mas_hlock = 1'b0; assign mas_hbusreq = 1'b0; % 구동할 7-세그멘트, LED를 연결하는 선

// HDATA Bidirection (HWDATA/HRDATA) always @(posedge hclk or negedge hresetn) begin : p_hdata if (!hresetn)// == 1'b0) begin ibidir_en_hdata <= 1'b0 ; end else if (slave_hreadyout == 1'b1) if (slave_hwrite == 1'b1) ibidir_en_hdata <= 1'b1 ; assign slave_hdata = (ibidir_en_hdata == 1'b0) ? slave_hrdata : {32{1'bz}}; assign slave_hwdata = slave_hdata ; % bidirectional 신호가 1이면 쓰기이므로 읽기 데이터는 하이임피던스로 놓고 slave_hdata로부터 쓰기데이터를 싣는다. Bidirectional 신호가 0이면 읽기이므로 읽기신호를 slave_hdata에 싣는다.

// // AHB2AHB ahb2ahb_sync_rec uahb2ahb ( .hclk(hclk), .hresetn (hresetn), .pain_hsel (slave_hsel), .pain_haddr (slave_haddr), .pain_hwrite (slave_hwrite), .pain_htrans (slave_htrans), .pain_hsize (slave_hsize), .pain_hburst (slave_hburst), .pain_hwdata (slave_hwdata), .pain_hmasterid (slave_hmaster), % AHB2AHB의 역할 : Master의 쓰기 데이터, 제어신호를 Slave에게 전달하고, Slave의 읽기 데이터, 제어신호를 Master에 전달한다.

.pain_hlock (slave_hmastlock), .pain_hprot (slave_hprot), .pain_hreadyin (slave_hreadyin), .paout_hready (slave_hreadyout), .paout_hresp (slave_hresp), .paout_hrdata (slave_hrdata), .paout_hsplit (slave_hsplit), .pbin_hready (sig_ahb_m0_in[0]), .pbin_hresp (sig_ahb_m0_in[2:1]), .pbin_hrdata (sig_ahb_m0_in[34:3]), .pbin_hgrant (sig_ahb_m0_in[35]), .pbout_hlock (sig_ahb_m0_out[0]), .pbout_htrans (sig_ahb_m0_out[2:1]), .pbout_haddr (sig_ahb_m0_out[34:3]), .pbout_hwrite (sig_ahb_m0_out[35]), .pbout_hsize (sig_ahb_m0_out[38:36]), .pbout_hburst (sig_ahb_m0_out[41:39]), .pbout_hprot (sig_ahb_m0_out[45:42]), .pbout_hwdata (sig_ahb_m0_out[77:46]), .pbout_hbusreq (sig_ahb_m0_out[78]) ); % Master의 쓰기 데이터와 제어신호를 합쳐서 79 비트신호를 만든다.

[1] Arbiter 역할 및 모든 신호를 중계한다. % AHB Matrix : [1] Arbiter 역할 및 모든 신호를 중계한다. [2] AHB2AHB로 부터 받은 79비트 데이터에 Arbitration 결과 선정된 마스터의 정보를 합쳐서 84 비트로 만들어 APB 브릿지 또는 AHB Dummy Slave로 보낸다. [3] APB 브릿지로부터 읽기데이터와 제어신호(HSPLIT)로 만든 51 비트 데이터를 받는다. // // AHB MATRIX ahb_matrix_m4s10r_rec usub_ahb_matrix ( .hclk(hclk), .hresetn(hresetn), .ahb_m0_in (sig_ahb_m0_in), .ahb_m1_in (sig_ahb_m1_in), .ahb_m2_in (sig_ahb_m2_in), .ahb_m3_in (sig_ahb_m3_in), .ahb_m0_out (sig_ahb_m0_out), .ahb_m1_out (sig_ahb_m1_out), .ahb_m2_out (sig_ahb_m2_out), .ahb_m3_out (sig_ahb_m3_out), .ahb_s0_in (sig_ahb_s0_in), .ahb_s1_in (sig_ahb_s1_in), .ahb_s2_in (sig_ahb_s2_in), .ahb_s3_in (sig_ahb_s3_in), .ahb_s4_in (sig_ahb_s4_in), .ahb_s5_in (sig_ahb_s5_in), % hready(1b), hresp(2b),hrdata(32b),hgrant(1b) ∴ total 36 bit Slave에서 Master로 보내는 데이터+제어신호 % hlock 1 htrans 2 haddr 32 hwrite 1 hsize 3 hburst 3 hprot 4 hwdata 32 hsel 1 hmasterid 4 hreadyin : 1 ∴ total 84 bit (Arbiter에서 Slave로 가는 주소,데이터, 제어신호들)

.ahb_s6_in (sig_ahb_s6_in), .ahb_s0_out (sig_ahb_s0_out), .ahb_s1_out (sig_ahb_s1_out), .ahb_s2_out (sig_ahb_s2_out), .ahb_s3_out (sig_ahb_s3_out), .ahb_s4_out (sig_ahb_s4_out), .ahb_s5_out (sig_ahb_s5_out), .ahb_s6_out (sig_ahb_s6_out), .ahb_s7_out (sig_ahb_s7_out), .ahb_s8_out (sig_ahb_s8_out), .ahb_s9_out (sig_ahb_s9_out), .hslaveid (sub_hslaveid), .decaddr (sub_decaddr) ); % hready_out(1) hresp(2) hrdata(32) hsplit(16) ∴total 51 bit AHB 또는 APB Slave로부터 AHB Matrix오는 읽기데이터, 제어신호들

always @(sub_decaddr) begin : ahb_sub_bus_dec // // AHB Address decoder always @(sub_decaddr) begin : ahb_sub_bus_dec case (sub_decaddr[31:28]) 4'b0001 : begin case (sub_decaddr[27:24]) 4'b0000 : sub_hslaveid <= 4'b1001 ; 4'b1000 : sub_hslaveid <= 4'b0011 ; default : sub_hslaveid <= 4'b0000 ; endcase end 4'b0000 : % AHB Matrix에 연결된 Slave를 선택하기 위하여 Decoder 실행 AHB Matrix에 연결된 APB Bridge를 선택하기 위하여 오른쪽과 같아야 함. % 어드레스 필드의 값 31:28 | 27:24|23:20|19:16|15:12 0000 0000 xxxx xxxx 0000

begin case (sub_decaddr[15:12]) 4'b0000 : sub_hslaveid <= 4'b0001 ; //APB Bridge 4'b0001 : sub_hslaveid <= 4'b0010 ; 4'b0011 : sub_hslaveid <= 4'b0100 ; 4'b0100 : sub_hslaveid <= 4'b0101 ; 4'b0101 : sub_hslaveid <= 4'b0110 ; 4'b0110 : sub_hslaveid <= 4'b0111 ; 4'b0111 : sub_hslaveid <= 4'b1000 ; default : sub_hslaveid <= 4'b0000 ; endcase end

ahb2apb_p8_rec u2ahb2apb_p8_rec ( .hclk (hclk), .hresetn (hresetn), .ahb_s_in (sig_ahb_s1_in), .ahb_s_out (sig_ahb_s1_out), .apb_s0_in (sig_apb_s0_in), .apb_s0_out (sig_apb_s0_out), .apb_s1_in (sig_apb_s1_in), .apb_s1_out (sig_apb_s1_out), .apb_s2_in (sig_apb_s2_in), .apb_s2_out (sig_apb_s2_out), .apb_s3_in (sig_apb_s3_in), .apb_s3_out (sig_apb_s3_out), .apb_s4_in (sig_apb_s4_in), .apb_s4_out (sig_apb_s4_out), .apb_s5_in (sig_apb_s5_in), .apb_s5_out (sig_apb_s5_out), .apb_s6_in (sig_apb_s6_in), .apb_s6_out (sig_apb_s6_out), .apb_s7_in (sig_apb_s7_in), .apb_s7_out (sig_apb_s7_out) ); % AHB2APB : APB 브릿지로서, Arbiter로부터 주소,쓰기데이터,제어신호 84비트를 받아 APB Slave로 주소, 쓰기데이터,제어신호 67비트를 보내고, APB Slave로부터 읽기데이터 32비트를 받음. 한편, 읽기데이터와 Slave로부터의 제어신호 51비트를 만들어 Arbiter로 보냄. 67 비트 32 비트

// AHB Master 0 : AHB Matrix Used // ************************************************************************* // // AHB Master Start // AHB Master 0 : AHB Matrix Used // AHB dummy Master 1 ahb_dummy_master_rec uahb_dummy_master_rec_sub1 ( .hclk (hclk), .hresetn (hresetn), .ahb_m_in (sig_ahb_m1_in), // 36 bit .ahb_m_out (sig_ahb_m1_out) // 79bit % hready(1b), hresp(2b),hrdata(32b),hgrant(1b) ∴ total 36 bit Slave에서 Master로 보내는 데이터+제어신호 % hlock 1 htrans 2 haddr 32 hwrite 1 hsize 3 hburst 3 hprot 4 hwdata 32 hbusreq 1 ∴ total 79 bit (Master에서 Arbiter로 가는 주소,데이터,제어신호들)

// // AHB dummy Master 2 ahb_dummy_master_rec uahb_dummy_master_rec_sub2 ( .hclk (hclk), .hresetn (hresetn), .ahb_m_in (sig_ahb_m2_in), .ahb_m_out (sig_ahb_m2_out) ); // AHB dummy Master 3 ahb_dummy_master_rec uahb_dummy_master_rec_sub3 .ahb_m_in (sig_ahb_m3_in),

ahb_dummy_master_rec uahb_dummy_master_rec_sub3 ( .hclk (hclk), // ahb_dummy_master_rec uahb_dummy_master_rec_sub3 ( .hclk (hclk), .hresetn (hresetn), .ahb_m_in (sig_ahb_m3_in), .ahb_m_out (sig_ahb_m3_out) ); // ************************************************************************* // AHB Slave Start // AHB dummy Slave 0 ahb_dummy_slave_rec uahb_dummy_slave_rec_sub0 .ahb_s_in (sig_ahb_s0_in), // 84 bit .ahb_s_out (sig_ahb_s0_out) // 51 bit % hlock 1 htrans 2 haddr 32 hwrite 1 hsize 3 hburst 3 hprot 4 hwdata 32 hsel 1 hmasterid 4 hreadyin : 1 ∴ total 84 bit (Arbiter에서 Slave로 가는 주소,데이터, 제어신호들) % hready_out(1) hresp(2) hrdata(32) hsplit(16) ∴total 51 bit AHB 또는 APB Slave로부터 AHB Matrix오는 읽기데이터, 제어신호들

// // AHB Slave 1 : APB Bridge Used // AHB dummy Slave 2 ahb_dummy_slave_rec uahb_dummy_slave_rec_sub2 ( .hclk (hclk), .hresetn (hresetn), .ahb_s_in (sig_ahb_s2_in), .ahb_s_out (sig_ahb_s2_out) );

// // AHB dummy Slave 3 ahb_dummy_slave_rec uahb_dummy_slave_rec_sub3 ( .hclk (hclk), .hresetn (hresetn), .ahb_s_in (sig_ahb_s3_in), .ahb_s_out (sig_ahb_s3_out) ); // AHB dummy Slave 4 ahb_dummy_slave_rec uahb_dummy_slave_rec_sub4 .ahb_s_in (sig_ahb_s4_in), .ahb_s_out (sig_ahb_s4_out)

// // AHB dummy Slave 5 ahb_dummy_slave_rec uahb_dummy_slave_rec_sub5 ( .hclk (hclk), .hresetn (hresetn), .ahb_s_in (sig_ahb_s5_in), .ahb_s_out (sig_ahb_s5_out) ); // AHB dummy Slave 6 ahb_dummy_slave_rec uahb_dummy_slave_rec_sub6 .ahb_s_in (sig_ahb_s6_in), .ahb_s_out (sig_ahb_s6_out)

// // AHB dummy Slave 7 ahb_dummy_slave_rec uahb_dummy_slave_rec_sub7 ( .hclk (hclk), .hresetn (hresetn), .ahb_s_in (sig_ahb_s7_in), .ahb_s_out (sig_ahb_s7_out) ); // AHB dummy Slave 8 ahb_dummy_slave_rec uahb_dummy_slave_rec_sub8 .ahb_s_in (sig_ahb_s8_in), .ahb_s_out (sig_ahb_s8_out)

// // AHB dummy Slave 9 ahb_dummy_slave_rec uahb_dummy_slave_rec_sub9 ( .hclk (hclk), .hresetn (hresetn), .ahb_s_in (sig_ahb_s9_in), .ahb_s_out (sig_ahb_s9_out) ); // ************************************************************************* // APB Start // APB dummy Slave 0

apb_dummy_slave_rec uapb_dummy_slave_rec_2nd_p0 ( .pclk (hclk), .presetn (hresetn), .apb_s_in (sig_apb_s0_in), //67 비트 .apb_s_out (sig_apb_s0_out) // 32 비트 ); // // APB dummy Slave 1 // apb_dummy_slave_rec uapb_dummy_slave_rec_2nd_p1 // ( // .pclk (hclk), // .presetn (hresetn), // .apb_s_in (sig_apb_s1_in), // .apb_s_out (sig_apb_s1_out) // ); % psel 1 penable 1 paddr 32 pwrite 1 pwdata 32 ∴ Total 67 bit (APB 브릿지에서 APB Slave로 가는 주소, 쓰기데이터, 제어신호들

% APB Slave 1 자리에 7-세그멘트 LED 루틴을 바꿔낀다. // // APB Slave 1 : 7-Segment / LED apb_seg_led_rec apb_seg_led_rec ( .pclk (hclk), .presetn (hresetn), .apb_s_in (sig_apb_s1_in), .apb_s_out (sig_apb_s1_out), .segout (segout), .segcom (segcom), .led_out (led) );

// // APB dummy Slave 2 apb_dummy_slave_rec uapb_dummy_slave_rec_2nd_p2 ( .pclk (hclk), .presetn (hresetn), .apb_s_in (sig_apb_s2_in), // 67 비트 .apb_s_out (sig_apb_s2_out) // 32 비트 ); // APB dummy Slave 3 apb_dummy_slave_rec uapb_dummy_slave_rec_2nd_p3 .presetn (hresetn), .apb_s_in (sig_apb_s3_in), .apb_s_out (sig_apb_s3_out)

// // APB dummy Slave 4 apb_dummy_slave_rec uapb_dummy_slave_rec_2nd_p4 ( .pclk (hclk), .presetn (hresetn), .apb_s_in (sig_apb_s4_in), .apb_s_out (sig_apb_s4_out) ); // APB dummy Slave 5 apb_dummy_slave_rec uapb_dummy_slave_rec_2nd_p5 .apb_s_in (sig_apb_s5_in), .apb_s_out (sig_apb_s5_out)

// // APB dummy Slave 6 apb_dummy_slave_rec uapb_dummy_slave_rec_2nd_p6 ( .pclk (hclk), .presetn (hresetn), .apb_s_in (sig_apb_s6_in), .apb_s_out (sig_apb_s6_out) ); // APB dummy Slave 7 apb_dummy_slave_rec uapb_dummy_slave_rec_2nd_p7 .apb_s_in (sig_apb_s7_in), .apb_s_out (sig_apb_s7_out) endmodule

[2] module ahb_dummy_master_rec (hclk, hresetn, ahb_m_in, ahb_m_out); input hclk; input hresetn; input[35:0] ahb_m_in; output[78:0] ahb_m_out; wire[78:0] ahb_m_out; assign ahb_m_out[0] = 1'b0 ; assign ahb_m_out[2:1] = 2'b00 ; assign ahb_m_out[34:3] = {32{1'b0}} ; assign ahb_m_out[35] = 1'b0 ; assign ahb_m_out[38:36] = 3'b000 ; assign ahb_m_out[41:39] = 3'b000 ; assign ahb_m_out[45:42] = 4'b0000 ; assign ahb_m_out[77:46] = {32{1'b0}} ; assign ahb_m_out[78] = 1'b0 ; endmodule % hlock 1 htrans 2 haddr 32 hwrite 1 hsize 3 hburst 3 hprot 4 hwdata 32 hbusreq 1 ∴ total 79 bit (Master에서 Arbiter로 가는 주소,데이터,제어신호들)

[3] module ahb_dummy_slave_rec (hclk, hresetn, ahb_s_in, ahb_s_out); input hclk; input hresetn; input[83:0] ahb_s_in; output[50:0] ahb_s_out; wire[50:0] ahb_s_out; assign ahb_s_out[0] = 1'b1 ; assign ahb_s_out[2:1] = 2'b00 ; assign ahb_s_out[34:3] = {32{1'b0}} ; assign ahb_s_out[50:35] = {16{1'b0}} ; endmodule % hready_out(1) hresp(2) hrdata(32) hsplit(16) ∴total 51 bit AHB 또는 APB Slave로부터 AHB Matrix오는 읽기데이터, 제어신호들

[4] module apb_dummy_slave_rec ( pclk, presetn, apb_s_in, apb_s_out ); input pclk; input presetn; input[66:0] apb_s_in; output[31:0] apb_s_out; wire[31:0] apb_s_out; assign apb_s_out = {32{1'b0}} ; endmodule % psel 1 penable 1 paddr 32 pwrite 1 pwdata 32 ∴ Total 67 bit (APB 브릿지에서 APB Slave로 가는 주소, 쓰기데이터, 제어신호들)

% psel 1 penable 1 paddr 32 pwrite 1 pwdata 32 ∴ Total 67 bit (APB 브릿지에서 APB Slave로 가는 주소, 쓰기데이터, 제어신호들) [5] module apb_seg_led_rec ( pclk, presetn, apb_s_in, apb_s_out, segout, segcom, led_out ); input pclk; input presetn; input[66:0] apb_s_in; output[31:0] apb_s_out; output[7:0] segout; output[7:0] segcom; output[7:0] led_out;

apb_seg_led u0 ( .presetn(presetn), .pclk(pclk), .psel(apb_s_in[0]), .penable(apb_s_in[1]), .paddr(apb_s_in[33:2]), .pwrite(apb_s_in[34]), .pwdata(apb_s_in[66:35]), .prdata(apb_s_out), .lcdclk(pclk), .segout(segout), .segcom(segcom), .led_out(led_out) ); endmodule

[6] module apb_seg_led( pclk, presetn, paddr, penable, psel, pwrite, pwdata, prdata, lcdclk, segout, segcom, led_out ); input pclk; input presetn; input [31:0] paddr;

input penable; input psel; input pwrite; input [31:0] pwdata; output [31:0] prdata; input lcdclk; output [7:0] segout; output [7:0] segcom; output [7:0] led_out; reg [31:0] reg_i; reg [31:0] reg_j; reg [31:0] rdata; reg [31:0] nextprdata;

// ***************************************************************************** // [1] RESET 구간 : LED / 7-SEGMENT 초기화 설정 // [2] wirte mode일 때 (PWRITE = '1') // PADDR[7:0] address decoder에 의한 // LED / 7-SEGMENT Register i,j 중 // 하나의 Register 값이 출력 됨. // // ************************************************************* always @(posedge pclk or negedge presetn) begin if (~presetn) begin reg_i <= 32'h71982000; // 7-Seg에 표시할 숫자 reg_j <= 32'h00000000; end else if (psel & pwrite & penable)

begin case (paddr[7:0]) 8'h00 : reg_i <= pwdata; // 7-segment 8'h04 : reg_j <= pwdata; // led register endcase end assign led_out = reg_j[7:0]; // ***************************************************************************** // [1] read mode일 때 (PWRITE = '0') // PADDR[7:0] address decoder에 의한

// LED / 7-SEGMENT Register i,j 중 // 하나의 Register 값이 ARM core에 전송 됨. // // ***************************************************************************** always @(paddr or psel or pwrite or reg_i) begin nextprdata <= 32'h00000000; if (psel & (~pwrite)) case (paddr[7:0]) 8'h00 : nextprdata <= reg_i; 8'h04 : nextprdata <= reg_j; default : nextprdata <= 32'hffffffff; endcase end always @(posedge pclk or negedge presetn) if (~presetn)

rdata <= 32'h00000000; else rdata <= nextprdata; end assign prdata = rdata; // ***************************************************************************** // // USER logic design 시작점

// // 7-segment display logic seven_seg useven_seg( .clk(lcdclk), .data(reg_i), .segout(segout), .segcom(segcom) ); endmodule

// ***************************************************************************** // 7-SEGMENT Display logic // [7] module seven_seg( clk, data, segout, segcom ); input clk; input [31:0] data; output [7:0] segout; output [7:0] segcom;

wire [7:0] seg1; wire [7:0] seg2; wire [7:0] seg3; wire [7:0] seg4; wire [7:0] seg5; wire [7:0] seg6; wire [7:0] seg7; wire [7:0] seg8; // // 7-SEGMENT Display logic 연결 선언 bin2seg bin2seg_1(.bin_data(data[31:28]), .seg_data(seg1)); bin2seg bin2seg_2(.bin_data(data[27:24]), .seg_data(seg2)); bin2seg bin2seg_3(.bin_data(data[23:20]), .seg_data(seg3)); bin2seg bin2seg_4(.bin_data(data[19:16]), .seg_data(seg4)); bin2seg bin2seg_5(.bin_data(data[15:12]), .seg_data(seg5)); bin2seg bin2seg_6(.bin_data(data[11: 8]), .seg_data(seg6));

bin2seg bin2seg_7(.bin_data(data[ 7: 4]), .seg_data(seg7)); reg [15:0] clk_cnt = 16'h0000; reg [2:0] com_cnt = 3'b000; // // [1] clk_cnt가 4000이 될 때 까지 counter 실행 // [2] clk_cnt가 4000이 되면 // - clk_cnt는 0으로 값이 설정되고 // - com_cnt는 +1씩 증가 // [3] clk_cnt가 4000이 될 때 까지 counter 실행 // [1]~[3]까지를 계속해서 반복 실행 always @(posedge clk) begin if (clk_cnt == 4000)

begin clk_cnt <= 16'h0000; if (com_cnt == 3'h7) com_cnt <= 3'h0; else com_cnt <= com_cnt + 1; end clk_cnt <= clk_cnt + 1; assign segcom = (com_cnt == 0) ? 8'b10000000 : (com_cnt == 1) ? 8'b01000000 : (com_cnt == 2) ? 8'b00100000 : (com_cnt == 3) ? 8'b00010000 : (com_cnt == 4) ? 8'b00001000 : (com_cnt == 5) ? 8'b00000100 : (com_cnt == 6) ? 8'b00000010 : 8'b00000001; % 8개의 7-Seg를 차례대로 불을 켬.

assign segout = (com_cnt == 0) ? ~seg1 : (com_cnt == 6) ? ~seg7 : ~seg8 ; endmodule // ***************************************************************************** // // 7-SEGMENT Display logic : number 입력에 대한 decoder 실행

[8] module bin2seg(bin_data, seg_data); input [3:0] bin_data; output [7:0] seg_data; wire [3:0] bin_data; wire [7:0] seg_data; assign seg_data = (bin_data==0)? 8'b11111100: (bin_data==1)? 8'b01100000: (bin_data==2)? 8'b11011010: (bin_data==3)? 8'b11110010: (bin_data==4)? 8'b01100110: (bin_data==5)? 8'b10110110: (bin_data==6)? 8'b10111110: (bin_data==7)? 8'b11100100: (bin_data==8)? 8'b11111110: 8'b11110110; endmodule