OpenCores
URL https://opencores.org/ocsvn/RISCMCU/RISCMCU/trunk

Subversion Repositories RISCMCU

[/] [RISCMCU/] [trunk/] [vhdl/] [v_riscmcu.vhd] - Diff between revs 8 and 19

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 8 Rev 19
Line 52... Line 52...
        );
        );
end v_riscmcu;
end v_riscmcu;
 
 
architecture riscmcu of v_riscmcu is
architecture riscmcu of v_riscmcu is
 
 
signal extpin : std_logic;
signal ext_irq_pin, ext_timer_clk_pin : std_logic;
 
 
signal clk, clrn, div2, div4, div8, div16 : std_logic;
signal clk, clrn, div2, div4, div8, div16 : std_logic;
signal sr, reg_rd, reg_rr, c, addrbus: std_logic_vector(7 downto 0);
signal sr, reg_rd, reg_rr, c, addrbus: std_logic_vector(7 downto 0);
 
 
signal pc, offset : std_logic_vector(8 downto 0);
signal pc, offset : std_logic_vector(8 downto 0);
Line 95... Line 95...
signal set : std_logic;
signal set : std_logic;
 
 
signal asel : integer range 0 to 1;
signal asel : integer range 0 to 1;
signal bsel : integer range 0 to 3;
signal bsel : integer range 0 to 3;
 
 
 
        -- Frequency Divider - Divide clock by 2(div2), 4(div4), 8(div8) and 16(div16)
        component v_freqdiv
        component v_freqdiv
        port (  clock : in std_logic;
        port (  clock : in std_logic;
                div2, div4, div8, div16 : buffer std_logic
                div2, div4, div8, div16 : buffer std_logic
        );
        );
        end component;
        end component;
 
 
 
        -- Program Counter (9 bit wide)
        component v_pc
        component v_pc
        port (  offset : in std_logic_vector(8 downto 0);
        port (  offset : in std_logic_vector(8 downto 0);
                en, addoffset, push, pull, vec2, vec4 : in std_logic;
                en, addoffset, push, pull, vec2, vec4 : in std_logic;
                clk, clrn : in std_logic;
                clk, clrn : in std_logic;
                pc : buffer std_logic_vector(8 downto 0)
                pc : buffer std_logic_vector(8 downto 0)
        );
        );
        end component;
        end component;
 
 
 
        -- Program ROM (512 words)
        component v_rom
        component v_rom
        port (  pc : in std_logic_vector(8 downto 0);
        port (  pc : in std_logic_vector(8 downto 0);
                instruction : out std_logic_vector(15 downto 0)
                instruction : out std_logic_vector(15 downto 0)
        );
        );
        end component;
        end component;
 
 
 
        -- Instruction Register (16 bit wide)
        component v_ir
        component v_ir
        port (  instruction : in std_logic_vector(15 downto 0);
        port (  instruction : in std_logic_vector(15 downto 0);
                en, clk, clrn : in std_logic;
                en, clk, clrn : in std_logic;
                ir : buffer std_logic_vector(15 downto 0);
                ir : buffer std_logic_vector(15 downto 0);
                imm_value : out std_logic_vector(7 downto 0);
                imm_value : out std_logic_vector(7 downto 0);
                rd, rr : out integer range 0 to 15
                rd, rr : out integer range 0 to 15
        );
        );
        end component;
        end component;
 
 
 
        -- Control Unit (with IO address decoder module inside)
        component v_controlunit
        component v_controlunit
        port (  ir      : in std_logic_vector(15 downto 0);
        port (  ir      : in std_logic_vector(15 downto 0);
                sr : in std_logic_vector(7 downto 0);
                sr : in std_logic_vector(7 downto 0);
                clk, clrn : in std_logic;
                clk, clrn : in std_logic;
                skip, extirq, timerirq : in std_logic;
                skip, extirq, timerirq : in std_logic;
Line 175... Line 180...
                rd_portc, wr_portc, rd_ddrc, wr_ddrc, rd_pinc : out std_logic;
                rd_portc, wr_portc, rd_ddrc, wr_ddrc, rd_pinc : out std_logic;
                rd_portd, wr_portd, rd_ddrd, wr_ddrd, rd_pind : out std_logic
                rd_portd, wr_portd, rd_ddrd, wr_ddrd, rd_pind : out std_logic
        );
        );
        end component;
        end component;
 
 
 
        -- General Purpose Register (16 x 8bit)
        component v_gpr
        component v_gpr
        port (  c : in std_logic_vector(7 downto 0);
        port (  c : in std_logic_vector(7 downto 0);
                wr_reg, inc_zp, dec_zp : in std_logic;
                wr_reg, inc_zp, dec_zp : in std_logic;
                rd, rr, dest : in integer range 0 to 15;
                rd, rr, dest : in integer range 0 to 15;
                clk, clrn : in std_logic;
                clk, clrn : in std_logic;
                reg_rd, reg_rr, addrbus : out std_logic_vector(7 downto 0)
                reg_rd, reg_rr, addrbus : out std_logic_vector(7 downto 0)
        );
        );
        end component;
        end component;
 
 
 
        -- ALU
        component v_alu
        component v_alu
        port (  reg_rd, reg_rr, imm_value : in std_logic_vector(7 downto 0);
        port (  reg_rd, reg_rr, imm_value : in std_logic_vector(7 downto 0);
                c2a, c2b : in std_logic;
                c2a, c2b : in std_logic;
                asel : in integer range 0 to 1;
                asel : in integer range 0 to 1;
                bsel : in integer range 0 to 3;
                bsel : in integer range 0 to 3;
Line 210... Line 217...
                tosr : buffer std_logic_vector (6 downto 0);
                tosr : buffer std_logic_vector (6 downto 0);
                skip : out std_logic
                skip : out std_logic
        );
        );
        end component;
        end component;
 
 
 
        -- Status Register (8 bit wide, flags are ITHSVNZC)
        component v_sr
        component v_sr
        port (  clk,clrn: in std_logic;
        port (  clk,clrn: in std_logic;
                        sren,tosr : in std_logic_vector(6 downto 0);
                        sren,tosr : in std_logic_vector(6 downto 0);
                        srsel : in integer range 0 to 7;
                        srsel : in integer range 0 to 7;
                        clr_i,set_i,bset,bclr : in std_logic;
                        clr_i,set_i,bset,bclr : in std_logic;
Line 221... Line 229...
                        c : inout std_logic_vector(7 downto 0);
                        c : inout std_logic_vector(7 downto 0);
                        sr : inout std_logic_vector(7 downto 0)
                        sr : inout std_logic_vector(7 downto 0)
        );
        );
        end component;
        end component;
 
 
 
        -- Data RAM (128 bytes)
        component v_ram
        component v_ram
        port (  addrbus : in std_logic_vector(7 downto 0);
        port (  addrbus : in std_logic_vector(7 downto 0);
                rd_ram, wr_ram, ld_mar, ld_mbr : in std_logic;
                rd_ram, wr_ram, ld_mar, ld_mbr : in std_logic;
                clk, clrn : in std_logic;
                clk, clrn : in std_logic;
                c : inout std_logic_vector(7 downto 0)
                c : inout std_logic_vector(7 downto 0)
        );
        );
        end component;
        end component;
 
 
 
        -- Standard 8-bit I/O Port module (all ports share this same module)
        component v_port
        component v_port
        port (  rd_port, wr_port, rd_ddr, wr_ddr, rd_pin : in std_logic;
        port (  rd_port, wr_port, rd_ddr, wr_ddr, rd_pin : in std_logic;
                clk, clrn : in std_logic;
                clk, clrn : in std_logic;
                c : inout std_logic_vector(7 downto 0);
                c : inout std_logic_vector(7 downto 0);
                pin : inout std_logic_vector(7 downto 0)
                pin : inout std_logic_vector(7 downto 0)
        );
        );
        end component;
        end component;
 
 
 
        -- 8-bit Timer with overflow interrupt request, can drive by external clock source
        component v_timer
        component v_timer
        port (  extpin, clr_tov0 : in std_logic;
        port (  extpin, clr_tov0 : in std_logic;
                rd_timsk, wr_timsk, rd_tifr, wr_tifr : in std_logic;
                rd_timsk, wr_timsk, rd_tifr, wr_tifr : in std_logic;
                rd_tccr0, wr_tccr0, rd_tcnt0, wr_tcnt0 : in std_logic;
                rd_tccr0, wr_tccr0, rd_tcnt0, wr_tcnt0 : in std_logic;
                clk, clrn : in std_logic;
                clk, clrn : in std_logic;
                c : inout std_logic_vector(7 downto 0);
                c : inout std_logic_vector(7 downto 0);
                timerirq : out std_logic
                timerirq : out std_logic
        );
        );
        end component;
        end component;
 
 
 
        -- External Interrupt
        component v_extint
        component v_extint
        port (  clk, clrn, extpin, clr_intf : in std_logic;
        port (  clk, clrn, extpin, clr_intf : in std_logic;
                rd_mcucr, wr_mcucr, rd_gimsk, wr_gimsk : in std_logic;
                rd_mcucr, wr_mcucr, rd_gimsk, wr_gimsk : in std_logic;
                extirq  : out std_logic;
                extirq  : out std_logic;
                c : inout std_logic_vector(7 downto 0)
                c : inout std_logic_vector(7 downto 0)
        );
        );
        end component;
        end component;
 
 
begin
begin
 
        --U_v_freqdiv: v_freqdiv
        U_v_freqdiv: v_freqdiv
        --      port map (clock, div2, div4, div8, div16);
                port map (clock, div2, div4, div8, div16);
 
 
 
        U_v_pc: v_pc
        U_v_pc: v_pc
                port map (offset, en, addoffset, push, pull, vec2, vec4, clk, clrn, pc);
                port map (offset, en, addoffset, push, pull, vec2, vec4, clk, clrn, pc);
 
 
        U_v_rom: v_rom
        U_v_rom: v_rom
Line 285... Line 296...
 
 
        U_v_ram: v_ram
        U_v_ram: v_ram
                port map (addrbus, rd_ram, wr_ram, ld_mar, ld_mbr, clk, clrn, c);
                port map (addrbus, rd_ram, wr_ram, ld_mar, ld_mbr, clk, clrn, c);
 
 
        U_v_timer: v_timer
        U_v_timer: v_timer
                port map (extpin, clr_tov0, rd_timsk, wr_timsk, rd_tifr, wr_tifr, rd_tccr0, wr_tccr0, rd_tcnt0, wr_tcnt0, clk, clrn, c, timerirq);
                port map (ext_timer_clk_pin, clr_tov0, rd_timsk, wr_timsk, rd_tifr, wr_tifr, rd_tccr0, wr_tccr0, rd_tcnt0, wr_tcnt0, clk, clrn, c, timerirq);
 
 
        U_v_extint: v_extint
        U_v_extint: v_extint
                port map (clk, clrn, extpin, clr_intf, rd_mcucr, wr_mcucr, rd_gimsk, wr_gimsk, extirq, c);
                port map (clk, clrn, ext_irq_pin, clr_intf, rd_mcucr, wr_mcucr, rd_gimsk, wr_gimsk, extirq, c);
 
 
 
 
 
        -- The same module v_port is used by 3 I/O ports, just the signals are different
        U_v_portB: v_port
        U_v_portB: v_port
                port map (rd_portb, wr_portb, rd_ddrb, wr_ddrb, rd_pinb, clk, clrn, c, pinb);
                port map (rd_portb, wr_portb, rd_ddrb, wr_ddrb, rd_pinb, clk, clrn, c, pinb);
 
 
        U_v_portC: v_port
        U_v_portC: v_port
                port map (rd_portc, wr_portc, rd_ddrc, wr_ddrc, rd_pinc, clk, clrn, c, pinc);
                port map (rd_portc, wr_portc, rd_ddrc, wr_ddrc, rd_pinc, clk, clrn, c, pinc);
 
 
        U_v_portD: v_port
        U_v_portD: v_port
                port map (rd_portd, wr_portd, rd_ddrd, wr_ddrd, rd_pind, clk, clrn, c, pind);
                port map (rd_portd, wr_portd, rd_ddrd, wr_ddrd, rd_pind, clk, clrn, c, pind);
 
 
        extpin <= pind(7);
        -- Global reset, it resets ALL flip-flops and registers to the initial state (normally gnd)
        clrn <= reset;
        clrn <= reset;
        clk <= div4;
 
        vcc <= '1';
        vcc <= '1';
        gnd <= '0';
        gnd <= '0';
        t_flag <= sr(6);
        t_flag <= sr(6);
        c_flag <= sr(0);
        c_flag <= sr(0);
 
 
 
        -- These are the external interrupt request pin and external timer clock source pin
 
        -- They share pins with the I/O ports
 
        -- TIPS: You can use any of the 24 I/O pins, I use pind(7) for my applications
 
        ext_irq_pin <= pind(2);
 
        ext_timer_clk_pin <= pind(4);
 
 
 
        -- When I use the UP1 board, the on-board 25 MHz clock is too fast and
 
        -- I need to divide it by 4 so that the MCU can run
 
        -- For waveform simulation, it does not require division (clk <= clock)
 
        -- TIPS: To have division, uncomment v_freqdiv module instantation on top of the page and 
 
        --       assign clk with div2, div4, div8 or div16
 
        clk <= clock;
 
 
 
 
end riscmcu;
end riscmcu;
 
 
 
 
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.