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