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

Subversion Repositories ax8

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 23 to Rev 24
    Reverse comparison

Rev 23 → Rev 24

/trunk/rtl/vhdl/A90S1200.vhd
1,7 → 1,7
--
-- 90S1200 compatible microcontroller core
--
-- Version : 0220b
-- Version : 0221
--
-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
--
47,6 → 47,7
-- 0146 : First release
-- 0220 : Changed to synchronous ROM
-- 0220b : Changed reset
-- 0221 : Changed to configurable buses
 
--Registers: Comments:
--$3F SREG Status Register Implemented in the AX8 core
74,7 → 75,8
 
entity A90S1200 is
generic(
SyncReset : boolean := true
SyncReset : boolean := true;
TriState : boolean := false
);
port(
Clk : in std_logic;
103,6 → 105,7
signal Reset_s_n : std_logic;
signal ROM_Addr : std_logic_vector(ROMAddressWidth - 1 downto 0);
signal ROM_Data : std_logic_vector(15 downto 0);
signal SREG : std_logic_vector(7 downto 0);
signal IO_Rd : std_logic;
signal IO_Wr : std_logic;
signal IO_Addr : std_logic_vector(5 downto 0);
126,6 → 129,14
signal TOV0 : std_logic;
signal Int_Trig : std_logic_vector(15 downto 1);
signal Int_Acc : std_logic_vector(15 downto 1);
signal TCCR : std_logic_vector(2 downto 0);
signal TCNT : std_logic_vector(7 downto 0);
signal DirB : std_logic_vector(7 downto 0);
signal Port_InB : std_logic_vector(7 downto 0);
signal Port_OutB : std_logic_vector(7 downto 0);
signal DirD : std_logic_vector(7 downto 0);
signal Port_InD : std_logic_vector(7 downto 0);
signal Port_OutD : std_logic_vector(7 downto 0);
 
begin
 
151,10 → 162,6
end generate;
 
-- Registers/Interrupts
IO_RData <= "00" & Sleep_En & "000" & ISC0 when IO_Rd = '1' and IO_Addr = "110101" else "ZZZZZZZZ"; -- $35 MCUCR
IO_RData <= "0" & Int0_En & "000000" when IO_Rd = '1' and IO_Addr = "111011" else "ZZZZZZZZ"; -- $3B GIMSK
IO_RData <= "000000" & TOIE0 & "0" when IO_Rd = '1' and IO_Addr = "111001" else "ZZZZZZZZ"; -- $39 TIMSK
IO_RData <= "000000" & TOV0 & "0" when IO_Rd = '1' and IO_Addr = "111000" else "ZZZZZZZZ"; -- $38 TIFR
process (Reset_s_n, Clk)
begin
if Reset_s_n = '0' then
220,11 → 227,12
Sleep_En => Sleep_En,
Int_Trig => Int_Trig,
Int_Acc => Int_Acc,
SREG => SREG,
IO_Rd => IO_Rd,
IO_Wr => IO_Wr,
IO_Addr => IO_Addr,
IO_WData => IO_WData,
IO_RData => IO_RData);
IO_RData => IO_RData,
IO_WData => IO_WData);
 
TCCR_Sel <= '1' when IO_Addr = "110011" else '0'; -- $33 TCCR0
TCNT_Sel <= '1' when IO_Addr = "110010" else '0'; -- $32 TCNT0
234,10 → 242,10
T => T0,
TCCR_Sel => TCCR_Sel,
TCNT_Sel => TCNT_Sel,
Rd => IO_Rd,
Wr => IO_Wr,
Data_In => IO_WData,
Data_Out => IO_RData,
TCCR => TCCR,
TCNT => TCNT,
Int => TC_Trig);
 
PINB_Sel <= '1' when IO_Addr = "010101" else '0';
246,27 → 254,66
PIND_Sel <= '1' when IO_Addr = "010000" else '0';
DDRD_Sel <= '1' when IO_Addr = "010001" else '0';
PORTD_Sel <= '1' when IO_Addr = "010010" else '0';
porta : AX_Port port map(
portb : AX_Port port map(
Clk => Clk,
Reset_n => Reset_s_n,
PORT_Sel => PORTB_Sel,
DDR_Sel => DDRB_Sel,
PIN_Sel => PINB_Sel,
Rd => IO_Rd,
Wr => IO_Wr,
Data_In => IO_WData,
Data_Out => IO_RData,
Dir => DirB,
Port_Input => Port_InB,
Port_Output => Port_OutB,
IOPort => Port_B);
portb : AX_Port port map(
portd : AX_Port port map(
Clk => Clk,
Reset_n => Reset_s_n,
PORT_Sel => PORTD_Sel,
DDR_Sel => DDRD_Sel,
PIN_Sel => PIND_Sel,
Rd => IO_Rd,
Wr => IO_Wr,
Data_In => IO_WData,
Data_Out => IO_RData,
Dir => DirD,
Port_Input => Port_InD,
Port_Output => Port_OutD,
IOPort => Port_D);
 
gNoTri : if not TriState generate
with IO_Addr select
IO_RData <= SREG when "111111",
"00" & Sleep_En & "000" & ISC0 when "110101",
"0" & Int0_En & "000000" when "111011",
"000000" & TOIE0 & "0" when "111001",
"000000" & TOV0 & "0" when "111000",
"00000" & TCCR when "110011",
TCNT when "110010",
Port_InB when "010101",
DirB when "010111",
Port_OutB when "011000",
Port_InD when "010000",
DirD when "010001",
Port_OutD when "010010",
"--------" when others;
end generate;
gTri : if TriState generate
IO_RData <= SREG when IO_Addr = "111111" else "ZZZZZZZZ";
 
IO_RData <= "00" & Sleep_En & "000" & ISC0 when IO_Addr = "110101" else "ZZZZZZZZ";
IO_RData <= "0" & Int0_En & "000000" when IO_Addr = "111011" else "ZZZZZZZZ";
IO_RData <= "000000" & TOIE0 & "0" when IO_Addr = "111001" else "ZZZZZZZZ";
IO_RData <= "000000" & TOV0 & "0" when IO_Addr = "111000" else "ZZZZZZZZ";
 
IO_RData <= "00000" & TCCR when TCCR_Sel = '1' else "ZZZZZZZZ";
IO_RData <= TCNT when TCNT_Sel = '1' else "ZZZZZZZZ";
 
IO_RData <= Port_InB when PINB_Sel = '1' else "ZZZZZZZZ";
IO_RData <= DirB when DDRB_Sel = '1' else "ZZZZZZZZ";
IO_RData <= Port_OutB when PORTB_Sel = '1' else "ZZZZZZZZ";
 
IO_RData <= Port_InD when PIND_Sel = '1' else "ZZZZZZZZ";
IO_RData <= DirD when DDRD_Sel = '1' else "ZZZZZZZZ";
IO_RData <= Port_OutD when PORTD_Sel = '1' else "ZZZZZZZZ";
end generate;
 
end;
/trunk/rtl/vhdl/AX8.vhd
1,7 → 1,7
--
-- AT90Sxxxx compatible microcontroller core
--
-- Version : 0221
-- Version : 0221b
--
-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
--
48,6 → 48,7
-- 0146 : First release
-- 0220 : Added support for synchronous ROM
-- 0221 : Changed tristate buses
-- 0221b : Changed tristate buses
 
library IEEE;
use IEEE.std_logic_1164.all;
69,11 → 70,13
Sleep_En : in std_logic;
Int_Trig : in std_logic_vector(15 downto 1);
Int_Acc : out std_logic_vector(15 downto 1);
SREG : out std_logic_vector(7 downto 0);
SP : out std_logic_vector(15 downto 0);
IO_Rd : out std_logic;
IO_Wr : out std_logic;
IO_Addr : out std_logic_vector(5 downto 0);
IO_RData : in std_logic_vector(7 downto 0);
IO_WData : out std_logic_vector(7 downto 0);
IO_RData : inout std_logic_vector(7 downto 0);
WDR : out std_logic
);
end AX8;
81,8 → 84,8
architecture rtl of AX8 is
 
-- Registers
signal SREG : std_logic_vector(7 downto 0);
signal SP : unsigned(15 downto 0);
signal SREG_i : std_logic_vector(7 downto 0);
signal SP_i : unsigned(15 downto 0);
signal NPC : std_logic_vector(15 downto 0);
signal PC : std_logic_vector(15 downto 0);
signal PCH : std_logic_vector(7 downto 0);
205,7 → 208,7
RAM_Wr_ID <= RAM_IW;
end if;
end process;
process (ROM_Data, Inst, DidPause, Pause, SP, X, Y, Z, Disp, IPush)
process (ROM_Data, Inst, DidPause, Pause, SP_i, X, Y, Z, Disp, IPush)
begin
Rd_Addr <= (others => '-');
Rr_Addr <= (others => '-');
279,7 → 282,7
Dec_X <= '1';
end if;
if Inst(3 downto 0) = "1111" then -- POP
Rr_Addr <= std_logic_vector(SP + 1);
Rr_Addr <= std_logic_vector(SP_i + 1);
Inc_SP <= '1';
end if;
end if;
316,7 → 319,7
Dec_X <= '1';
end if;
if Inst(3 downto 0) = "1111" then -- PUSH
Rd_Addr <= std_logic_vector(SP);
Rd_Addr <= std_logic_vector(SP_i);
Dec_SP <= '1';
end if;
end if;
333,12 → 336,12
end if;
if ((DidPause /= "01" and (Inst = "1001010100001001" or Inst(15 downto 12) = "1101")) or IPush = '1') and BigISet then
-- RCALL, ICALL
Rd_Addr <= std_logic_vector(SP);
Rd_Addr <= std_logic_vector(SP_i);
Dec_SP <= '1';
end if;
if DidPause(0) = DidPause(1) and (Inst = "1001010100001000" or Inst = "1001010100011000") and BigISet then
-- RET, RETI
Rr_Addr <= std_logic_vector(SP + 1);
Rr_Addr <= std_logic_vector(SP_i + 1);
Inc_SP <= '1';
end if;
if DidPause = "00" and Inst = "1001010111001000" and BigISet then
388,12 → 391,11
end process;
 
-- IO access
SP <= std_logic_vector(SP_i);
IO_Addr <= IO_Addr_i;
IO_Rd <= IO_Rd_i;
IO_Wr <= IO_Wr_i;
IO_WData <= IO_BMData when Inst(15 downto 11) = "10011" and Inst(8) = '0' else Rd_Data;
IO_RData <= std_logic_vector(SP(7 downto 0)) when IO_Addr_i = "111101" and BigIset else "ZZZZZZZZ";
IO_RData <= std_logic_vector(SP(15 downto 8)) when IO_Addr_i = "111110" and BigIset else "ZZZZZZZZ";
IO_BTest <= Bit_Pattern and IO_RData;
IOZ_Skip <= '1' when ((IO_BTest /= "00000000") and (Do_SBIS = '1')) or
((IO_BTest = "00000000") and (Do_SBIC = '1')) else '0';
401,7 → 403,7
begin
if Reset_n = '0' then
if BigISet then
SP <= (others => '0');
SP_i <= (others => '0');
end if;
IO_Addr_i <= (others => '0');
IO_BMData <= (others => '0');
440,17 → 442,17
end if;
if IO_Wr_i = '1' and BigISet then
if IO_Addr_i = "111101" then --$3D ($5D) SPL Stack Pointer Low
SP(7 downto 0) <= unsigned(Rd_Data);
SP_i(7 downto 0) <= unsigned(Rd_Data);
end if;
if IO_Addr_i = "111110" then --$3E ($5E) SPH Stack Pointer High
SP(15 downto 8) <= unsigned(Rd_Data);
SP_i(15 downto 8) <= unsigned(Rd_Data);
end if;
end if;
if Dec_SP = '1' and BigISet then
SP <= SP - 1;
SP_i <= SP_i - 1;
end if;
if Inc_SP = '1' and BigISet then
SP <= SP + 1;
SP_i <= SP_i + 1;
end if;
end if;
end process;
499,30 → 501,30
end process;
 
-- Status register
IO_RData <= SREG when IO_Addr_i = "111111" else "ZZZZZZZZ";
SREG <= SREG_i;
process (Reset_n, Clk)
begin
if Reset_n = '0' then
SREG <= "00000000";
SREG_i <= "00000000";
elsif Clk'event and Clk = '1' then
if IO_Wr_i = '1' and IO_Addr_i = "111111" then --$3F ($5F) SREG Status Register
SREG <= Rd_Data;
SREG_i <= Rd_Data;
end if;
if Inst(15 downto 8) = "10010100" and Inst(3 downto 0) = "1000" then
SREG(to_integer(unsigned(Inst(6 downto 4)))) <= not Inst(7); -- BSET, BCLR
SREG_i(to_integer(unsigned(Inst(6 downto 4)))) <= not Inst(7); -- BSET, BCLR
end if;
if Inst = "1001010100011000" then SREG(7) <= '1'; end if;
if Inst = "1001010100011000" then SREG_i(7) <= '1'; end if;
if IPush = '1' then
SREG(7) <= '0';
SREG_i(7) <= '0';
end if;
if Status_Wr(6) = '1' then SREG(6) <= Status_D(6); end if;
if Status_Wr(5) = '1' then SREG(5) <= Status_D(5); end if;
if Status_Wr(4) = '1' then SREG(4) <= Status_D(4); end if;
if Status_Wr(3) = '1' then SREG(3) <= Status_D(3); end if;
if Status_Wr(2) = '1' then SREG(2) <= Status_D(2); end if;
if Status_Wr(1) = '1' then SREG(1) <= Status_D(1); end if;
if Status_Wr(0) = '1' then SREG(0) <= Status_D(0); end if;
if Status_D_Wr = '1' and BigISet then SREG(4 downto 0) <= Status_D_R; end if;
if Status_Wr(6) = '1' then SREG_i(6) <= Status_D(6); end if;
if Status_Wr(5) = '1' then SREG_i(5) <= Status_D(5); end if;
if Status_Wr(4) = '1' then SREG_i(4) <= Status_D(4); end if;
if Status_Wr(3) = '1' then SREG_i(3) <= Status_D(3); end if;
if Status_Wr(2) = '1' then SREG_i(2) <= Status_D(2); end if;
if Status_Wr(1) = '1' then SREG_i(1) <= Status_D(1); end if;
if Status_Wr(0) = '1' then SREG_i(0) <= Status_D(0); end if;
if Status_D_Wr = '1' and BigISet then SREG_i(4 downto 0) <= Status_D_R; end if;
end if;
end process;
 
596,8 → 598,8
PCPause <= '1' when (IndSkip = '0' and ((Pause /= "00" and DidPause = "00") or DidPause(1) = '1')) or Sleep = '1' else '0';
RJmp <= '1' when Inst(15 downto 12) = "1100" or
(Inst(15 downto 12) = "1101" and DidPause = "10") or
(CBranch = '1' and Inst(10) = '0' and ((SREG and Bit_Pattern) /= "00000000")) or
(CBranch = '1' and Inst(10) = '1' and ((SREG and Bit_Pattern) = "00000000")) else '0';
(CBranch = '1' and Inst(10) = '0' and ((SREG_i and Bit_Pattern) /= "00000000")) or
(CBranch = '1' and Inst(10) = '1' and ((SREG_i and Bit_Pattern) = "00000000")) else '0';
HRet <= '1' when DidPause = "11" and BigIset and
(Inst = "1001010100001000" or Inst = "1001010100011000") else '0';
LRet <= '1' when DidPause = "10" and BigIset and
710,7 → 712,7
A => Rd_Data,
B => Op_Mux,
Q => Q,
SREG => SREG,
SREG => SREG_i,
PassB => PassB,
Skip => Inst_Skip,
Do_Other => Do_Other,
736,7 → 738,7
if Inst = "1001010110001000" and Sleep_En = '1' then
Sleep <= '1';
end if;
if Int_Trig /= "000000000000000" and SREG(7) = '1' then
if Int_Trig /= "000000000000000" and SREG_i(7) = '1' then
Sleep <= '0';
IPending <= '1';
end if;
/trunk/rtl/vhdl/AX_UART.vhd
1,7 → 1,7
--
-- AT90Sxxxx compatible microcontroller core
--
-- Version : 0146
-- Version : 0221
--
-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
--
44,6 → 44,8
--
-- File history :
--
-- 0146 : First release
-- 0221 : Removed tristate
 
library IEEE;
use IEEE.std_logic_1164.all;
61,7 → 63,10
Wr : in std_logic;
TXC_Clr : in std_logic;
Data_In : in std_logic_vector(7 downto 0);
Data_Out : out std_logic_vector(7 downto 0);
UDR : out std_logic_vector(7 downto 0);
USR : out std_logic_vector(7 downto 3);
UCR : out std_logic_vector(7 downto 0);
UBRR : out std_logic_vector(7 downto 0);
RXD : in std_logic;
TXD : out std_logic;
Int_RX : out std_logic;
72,10 → 77,10
 
architecture rtl of AX_UART is
 
signal UDR : std_logic_vector(7 downto 0); -- UART I/O Data Register
signal USR : std_logic_vector(7 downto 3); -- UART Status Register
signal UCR : std_logic_vector(7 downto 0); -- UART Control Register
signal UBRR : std_logic_vector(7 downto 0); -- UART Baud Rate Register
signal UDR_i : std_logic_vector(7 downto 0); -- UART I/O Data Register
signal USR_i : std_logic_vector(7 downto 3); -- UART Status Register
signal UCR_i : std_logic_vector(7 downto 0); -- UART Control Register
signal UBRR_i : std_logic_vector(7 downto 0); -- UART Baud Rate Register
 
signal Baud16 : std_logic;
 
93,23 → 98,23
begin
 
-- Registers
Data_Out <= UDR when UDR_Sel = '1' and Rd = '1' else "ZZZZZZZZ";
Data_Out <= USR & "000" when USR_Sel = '1' and Rd = '1' else "ZZZZZZZZ";
Data_Out <= UCR(7 downto 1) & "0" when UCR_Sel = '1' and Rd = '1' else "ZZZZZZZZ";
Data_Out <= UBRR when UBRR_Sel = '1' and Rd = '1' else "ZZZZZZZZ";
UDR <= UDR_i;
USR <= USR_i;
UCR <= UCR_i;
UBRR <= UBRR_i;
process (Reset_n, Clk)
begin
if Reset_n = '0' then
UCR(7 downto 2) <= "000000";
UCR(0) <= '0';
UBRR <= "00000000";
UCR_i(7 downto 2) <= "000000";
UCR_i(0) <= '0';
UBRR_i <= "00000000";
elsif Clk'event and Clk = '1' then
if UCR_Sel = '1' and Wr = '1' then
UCR(7 downto 2) <= Data_In(7 downto 2);
UCR(0) <= Data_In(0);
UCR_i(7 downto 2) <= Data_In(7 downto 2);
UCR_i(0) <= Data_In(0);
end if;
if UBRR_Sel = '1' and Wr = '1' then
UBRR <= Data_In;
UBRR_i <= Data_In;
end if;
end if;
end process;
123,7 → 128,7
Baud16 <= '0';
elsif Clk'event and Clk='1' then
if Baud_Cnt = "00000000" then
Baud_Cnt := unsigned(UBRR);
Baud_Cnt := unsigned(UBRR_i);
Baud16 <= '1';
else
Baud_Cnt := Baud_Cnt - 1;
154,15 → 159,15
end process;
 
-- Receive state machine
Int_RX <= USR(7) and UCR(7);
Int_RX <= USR_i(7) and UCR_i(7);
process (Clk, Reset_n)
begin
if Reset_n = '0' then
USR(7) <= '0';
USR(4) <= '0';
USR(3) <= '0';
UCR(1) <= '1';
UDR <= "00000000";
USR_i(7) <= '0';
USR_i(4) <= '0';
USR_i(3) <= '0';
UCR_i(1) <= '1';
UDR_i <= "00000000";
Overflow_t <= '0';
Bit_Phase <= "0000";
RX_ShiftReg(8 downto 0) <= "000000000";
169,8 → 174,8
RX_Bit_Cnt <= 0;
elsif Clk'event and Clk = '1' then
if UDR_Sel = '1' and Rd = '1' then
USR(7) <= '0';
USR(3) <= Overflow_t;
USR_i(7) <= '0';
USR_i(3) <= Overflow_t;
end if;
if Baud16 = '1' then
if RX_Bit_Cnt = 0 and (RX_Filtered = '1' or Bit_Phase = "0111") then
184,23 → 189,23
end if;
elsif Bit_Phase = "1111" then
RX_Bit_Cnt <= RX_Bit_Cnt + 1;
if (UCR(2) = '0' and RX_Bit_Cnt = 9) or
(UCR(2) = '1' and RX_Bit_Cnt = 10) then -- Stop bit
if (UCR_i(2) = '0' and RX_Bit_Cnt = 9) or
(UCR_i(2) = '1' and RX_Bit_Cnt = 10) then -- Stop bit
RX_Bit_Cnt <= 0;
if UCR(4) = '1' then
USR(7) <= '1'; -- UART Receive complete
USR(4) <= not RX_Filtered; -- Framing error
Overflow_t <= USR(7);
if USR(7) = '0' or (UDR_Sel = '1' and Rd = '1') then
if UCR_i(4) = '1' then
USR_i(7) <= '1'; -- UART Receive complete
USR_i(4) <= not RX_Filtered; -- Framing error
Overflow_t <= USR_i(7);
if USR_i(7) = '0' or (UDR_Sel = '1' and Rd = '1') then
Overflow_t <= '0';
USR(3) <= '0';
UDR <= RX_ShiftReg(7 downto 0);
UCR(1) <= RX_ShiftReg(8);
USR_i(3) <= '0';
UDR_i <= RX_ShiftReg(7 downto 0);
UCR_i(1) <= RX_ShiftReg(8);
end if;
end if;
else
RX_ShiftReg(7 downto 0) <= RX_ShiftReg(8 downto 1);
if UCR(2) = '1' then -- CHR9
if UCR_i(2) = '1' then -- CHR9
RX_ShiftReg(8) <= RX_Filtered;
else
RX_ShiftReg(7) <= RX_Filtered;
230,13 → 235,13
end process;
 
-- Transmit state machine
Int_TR <= USR(5) and UCR(5);
Int_TC <= USR(6) and UCR(6);
Int_TR <= USR_i(5) and UCR_i(5);
Int_TC <= USR_i(6) and UCR_i(6);
process (Clk, Reset_n)
begin
if Reset_n = '0' then
USR(6) <= '0';
USR(5) <= '1';
USR_i(6) <= '0';
USR_i(5) <= '1';
TX_Bit_Cnt <= 0;
TX_ShiftReg <= (others => '0');
TX_Data <= (others => '0');
243,36 → 248,36
TXD <= '1';
elsif Clk'event and Clk = '1' then
if TXC_Clr = '1' or (USR_Sel = '1' and Wr = '1' and Data_In(6) = '1') then
USR(6) <= '0';
USR_i(6) <= '0';
end if;
if UDR_Sel = '1' and Wr = '1' and UCR(3) = '1' then
USR(5) <= '0';
if UDR_Sel = '1' and Wr = '1' and UCR_i(3) = '1' then
USR_i(5) <= '0';
TX_Data <= Data_In;
end if;
if TX_Tick = '1' then
case TX_Bit_Cnt is
when 0 =>
if USR(5) = '0' then
if USR_i(5) = '0' then
TX_Bit_Cnt <= 1;
end if;
TXD <= '1';
when 1 => -- Start bit
TX_ShiftReg(7 downto 0) <= TX_Data;
TX_ShiftReg(8) <= UCR(0);
USR(5) <= '1';
TX_ShiftReg(8) <= UCR_i(0);
USR_i(5) <= '1';
TXD <= '0';
TX_Bit_Cnt <= TX_Bit_Cnt + 1;
when others =>
TX_Bit_Cnt <= TX_Bit_Cnt + 1;
if UCR(2) = '1' then -- CHR9
if UCR_i(2) = '1' then -- CHR9
if TX_Bit_Cnt = 10 then
TX_Bit_Cnt <= 0;
USR(6) <= '1';
USR_i(6) <= '1';
end if;
else
if TX_Bit_Cnt = 9 then
TX_Bit_Cnt <= 0;
USR(6) <= '1';
USR_i(6) <= '1';
end if;
end if;
TXD <= TX_ShiftReg(0);
/trunk/rtl/vhdl/A90S2313.vhd
1,7 → 1,7
--
-- 90S2313 compatible microcontroller core
--
-- Version : 0220b
-- Version : 0221
--
-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
--
47,6 → 47,7
-- 0146 : First release
-- 0220 : Changed to synchronous ROM
-- 0220b : Changed reset
-- 0221 : Changed to configurable buses
 
--Registers: Comments:
--$3F SREG Status Register Implemented in the AX8 core
88,7 → 89,8
 
entity A90S2313 is
generic(
SyncReset : boolean := true
SyncReset : boolean := true;
TriState : boolean := false
);
port(
Clk : in std_logic;
123,6 → 125,8
signal Reset_s_n : std_logic;
signal ROM_Addr : std_logic_vector(ROMAddressWidth - 1 downto 0);
signal ROM_Data : std_logic_vector(15 downto 0);
signal SREG : std_logic_vector(7 downto 0);
signal SP : std_logic_vector(15 downto 0);
signal IO_Rd : std_logic;
signal IO_Wr : std_logic;
signal IO_Addr : std_logic_vector(5 downto 0);
165,6 → 169,26
signal TOV1 : std_logic;
signal Int_Trig : std_logic_vector(15 downto 1);
signal Int_Acc : std_logic_vector(15 downto 1);
signal TCCR0 : std_logic_vector(2 downto 0);
signal TCNT0 : std_logic_vector(7 downto 0);
signal COM : std_logic_vector(1 downto 0);
signal PWM : std_logic_vector(1 downto 0);
signal CRBH : std_logic_vector(1 downto 0);
signal CRBL : std_logic_vector(3 downto 0);
signal TCNT1 : std_logic_vector(15 downto 0);
signal IC : std_logic_vector(15 downto 0);
signal OCR : std_logic_vector(15 downto 0);
signal Tmp : std_logic_vector(15 downto 0);
signal UDR : std_logic_vector(7 downto 0);
signal USR : std_logic_vector(7 downto 3);
signal UCR : std_logic_vector(7 downto 0);
signal UBRR : std_logic_vector(7 downto 0);
signal DirB : std_logic_vector(7 downto 0);
signal Port_InB : std_logic_vector(7 downto 0);
signal Port_OutB : std_logic_vector(7 downto 0);
signal DirD : std_logic_vector(7 downto 0);
signal Port_InD : std_logic_vector(7 downto 0);
signal Port_OutD : std_logic_vector(7 downto 0);
 
begin
 
190,10 → 214,6
end generate;
 
-- Registers/Interrupts
IO_RData <= "00" & Sleep_En & "0" & ISC1 & ISC0 when IO_Rd = '1' and IO_Addr = "110101" else "ZZZZZZZZ"; -- $35 MCUCR
IO_RData <= Int_En & "000000" when IO_Rd = '1' and IO_Addr = "111011" else "ZZZZZZZZ"; -- $3B GIMSK
IO_RData <= TOIE1 & OCIE1 & "00" & TICIE1 & "0" & TOIE0 & "0" when IO_Rd = '1' and IO_Addr = "111001" else "ZZZZZZZZ"; -- $39 TIMSK
IO_RData <= TOV1 & OCF1 & "00" & ICF1 & "0" & TOV0 & "0" when IO_Rd = '1' and IO_Addr = "111000" else "ZZZZZZZZ"; -- $38 TIFR
process (Reset_s_n, Clk)
begin
if Reset_s_n = '0' then
310,11 → 330,13
Sleep_En => Sleep_En,
Int_Trig => Int_Trig,
Int_Acc => Int_Acc,
SREG => SREG,
SP => SP,
IO_Rd => IO_Rd,
IO_Wr => IO_Wr,
IO_Addr => IO_Addr,
IO_WData => IO_WData,
IO_RData => IO_RData);
IO_RData => IO_RData,
IO_WData => IO_WData);
 
TCCR0_Sel <= '1' when IO_Addr = "110011" else '0'; -- $33 TCCR0
TCNT0_Sel <= '1' when IO_Addr = "110010" else '0'; -- $32 TCNT0
324,10 → 346,10
T => T0,
TCCR_Sel => TCCR0_Sel,
TCNT_Sel => TCNT0_Sel,
Rd => IO_Rd,
Wr => IO_Wr,
Data_In => IO_WData,
Data_Out => IO_RData,
TCCR => TCCR0,
TCNT => TCNT0,
Int => TC_Trig);
 
TCCR1_Sel <= '1' when IO_Addr(5 downto 1) = "10111" else '0'; -- $2E TCCR1
347,7 → 369,14
Rd => IO_Rd,
Wr => IO_Wr,
Data_In => IO_WData,
Data_Out => IO_RData,
COM => COM,
PWM => PWM,
CRBH => CRBH,
CRBL => CRBL,
TCNT => TCNT1,
IC => IC,
OCR => OCR,
Tmp => Tmp,
OC => OC,
Int_TO => TO_Trig,
Int_OC => OC_Trig,
368,7 → 397,10
Wr => IO_Wr,
TXC_Clr => Int_Acc(9),
Data_In => IO_WData,
Data_Out => IO_RData,
UDR => UDR,
USR => USR,
UCR => UCR,
UBRR => UBRR,
RXD => RXD,
TXD => TXD,
Int_RX => Int_Trig(7),
381,27 → 413,92
PIND_Sel <= '1' when IO_Addr = "010000" else '0';
DDRD_Sel <= '1' when IO_Addr = "010001" else '0';
PORTD_Sel <= '1' when IO_Addr = "010010" else '0';
porta : AX_Port port map(
portb : AX_Port port map(
Clk => Clk,
Reset_n => Reset_s_n,
PORT_Sel => PORTB_Sel,
DDR_Sel => DDRB_Sel,
PIN_Sel => PINB_Sel,
Rd => IO_Rd,
Wr => IO_Wr,
Data_In => IO_WData,
Data_Out => IO_RData,
Dir => DirB,
Port_Input => Port_InB,
Port_Output => Port_OutB,
IOPort => Port_B);
portb : AX_Port port map(
portd : AX_Port port map(
Clk => Clk,
Reset_n => Reset_s_n,
PORT_Sel => PORTD_Sel,
DDR_Sel => DDRD_Sel,
PIN_Sel => PIND_Sel,
Rd => IO_Rd,
Wr => IO_Wr,
Data_In => IO_WData,
Data_Out => IO_RData,
Dir => DirD,
Port_Input => Port_InD,
Port_Output => Port_OutD,
IOPort => Port_D);
 
gNoTri : if not TriState generate
with IO_Addr select
IO_RData <= SREG when "111111",
SP(7 downto 0) when "111101",
SP(15 downto 8) when "111110",
"00" & Sleep_En & "0" & ISC1 & ISC0 when "110101",
Int_En & "000000" when "111011",
TOIE1 & OCIE1 & "00" & TICIE1 & "0" & TOIE0 & "0" when "111001",
TOV1 & OCF1 & "00" & ICF1 & "0" & TOV0 & "0" when "111000",
UDR when "001100",
USR & "000" when "001011",
UCR(7 downto 1) & "0" when "001010",
UBRR when "001001",
"00000" & TCCR0 when "110011",
TCNT0 when "110010",
COM & "0000" & PWM when "101111",
CRBH & "00" & CRBL when "101110",
TCNT1(7 downto 0) when "101100",
OCR(7 downto 0) when "101010",
IC(7 downto 0) when "101000",
Tmp(15 downto 8) when "101101" | "101001" | "101011",
Port_InB when "010101",
DirB when "010111",
Port_OutB when "011000",
Port_InD when "010000",
DirD when "010001",
Port_OutD when "010010",
"--------" when others;
end generate;
gTri : if TriState generate
IO_RData <= SREG when IO_Addr = "111111" else "ZZZZZZZZ";
IO_RData <= SP(7 downto 0) when IO_Addr = "111101" and BigIset else "ZZZZZZZZ";
IO_RData <= SP(15 downto 8) when IO_Addr = "111110" and BigIset else "ZZZZZZZZ";
 
IO_RData <= "00" & Sleep_En & "0" & ISC1 & ISC0 when IO_Addr = "110101" else "ZZZZZZZZ";
IO_RData <= Int_En & "000000" when IO_Rd = '1' and IO_Addr = "111011" else "ZZZZZZZZ";
IO_RData <= TOIE1 & OCIE1 & "00" & TICIE1 & "0" & TOIE0 & "0" when IO_Addr = "111001" else "ZZZZZZZZ";
IO_RData <= TOV1 & OCF1 & "00" & ICF1 & "0" & TOV0 & "0" when IO_Addr = "111000" else "ZZZZZZZZ";
 
IO_RData <= UDR when UDR_Sel = '1' else "ZZZZZZZZ";
IO_RData <= USR & "000" when USR_Sel = '1' else "ZZZZZZZZ";
IO_RData <= UCR(7 downto 1) & "0" when UCR_Sel = '1' else "ZZZZZZZZ";
IO_RData <= UBRR when UBRR_Sel = '1' else "ZZZZZZZZ";
 
IO_RData <= "00000" & TCCR0 when TCCR0_Sel = '1' else "ZZZZZZZZ";
IO_RData <= TCNT0 when TCNT0_Sel = '1' else "ZZZZZZZZ";
 
IO_RData <= COM & "0000" & PWM when TCCR1_Sel = '1' and IO_Addr(0) = '1' else "ZZZZZZZZ";
IO_RData <= CRBH & "00" & CRBL when TCCR1_Sel = '1' and IO_Addr(0) = '0' else "ZZZZZZZZ";
IO_RData <= TCNT1(7 downto 0) when TCNT1_Sel = '1' and IO_Addr(0) = '0' else "ZZZZZZZZ";
IO_RData <= OCR(7 downto 0) when OCR1_Sel = '1' and IO_Addr(0) = '0' else "ZZZZZZZZ";
IO_RData <= IC(7 downto 0) when ICR1_Sel = '1' and IO_Addr(0) = '0' else "ZZZZZZZZ";
IO_RData <= Tmp(15 downto 8) when (TCNT1_Sel = '1' or ICR1_Sel = '1' or OCR1_Sel = '1') and IO_Addr(0) = '1' else "ZZZZZZZZ";
 
IO_RData <= Port_InB when PINB_Sel = '1' else "ZZZZZZZZ";
IO_RData <= DirB when DDRB_Sel = '1' else "ZZZZZZZZ";
IO_RData <= Port_OutB when PORTB_Sel = '1' else "ZZZZZZZZ";
 
IO_RData <= Port_InD when PIND_Sel = '1' else "ZZZZZZZZ";
IO_RData <= DirD when DDRD_Sel = '1' else "ZZZZZZZZ";
IO_RData <= Port_OutD when PORTD_Sel = '1' else "ZZZZZZZZ";
end generate;
 
end;
/trunk/rtl/vhdl/AX_Reg.vhd
1,7 → 1,7
--
-- AT90Sxxxx compatible microcontroller core
--
-- Version : 0221
-- Version : 0221b
--
-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
--
45,6 → 45,7
-- File history :
--
-- 0221 : Moved register bank to separate file
-- 0221 : Changed buses
 
library IEEE;
use IEEE.std_logic_1164.all;
54,7 → 55,7
entity AX_Reg is
generic(
BigISet : boolean;
TriState : boolean := true
TriState : boolean := false
);
port (
Clk : in std_logic;
119,48 → 120,55
Status_D(4) <= ASR(15) xor Carry_v xor Carry15_v; -- S
end generate;
 
gNoTri : if not TriState generate
Rd_Data <= std_logic_vector(W_i(7 downto 0)) when Rd_Addr_r = "11000" and BigISet else
std_logic_vector(W_i(15 downto 8)) when Rd_Addr_r = "11001" and BigISet else
std_logic_vector(X_i(7 downto 0)) when Rd_Addr_r = "11010" and BigISet else
std_logic_vector(X_i(15 downto 8)) when Rd_Addr_r = "11011" and BigISet else
std_logic_vector(Y_i(7 downto 0)) when Rd_Addr_r = "11100" and BigISet else
std_logic_vector(Y_i(15 downto 8)) when Rd_Addr_r = "11101" and BigISet else
std_logic_vector(Z_i(7 downto 0)) when Rd_Addr_r = "11110" and BigISet else
std_logic_vector(Z_i(15 downto 8)) when Rd_Addr_r = "11111" and BigISet else
Reg_D_i;
Rr_Data <= std_logic_vector(W_i(7 downto 0)) when Rr_Addr_r = "11000" and BigISet else
std_logic_vector(W_i(15 downto 8)) when Rr_Addr_r = "11001" and BigISet else
std_logic_vector(X_i(7 downto 0)) when Rr_Addr_r = "11010" and BigISet else
std_logic_vector(X_i(15 downto 8)) when Rr_Addr_r = "11011" and BigISet else
std_logic_vector(Y_i(7 downto 0)) when Rr_Addr_r = "11100" and BigISet else
std_logic_vector(Y_i(15 downto 8)) when Rr_Addr_r = "11101" and BigISet else
std_logic_vector(Z_i(7 downto 0)) when Rr_Addr_r = "11110" and BigISet else
std_logic_vector(Z_i(15 downto 8)) when Rr_Addr_r = "11111" and BigISet else
Reg_R_i;
gNoTri : if not TriState and BigISet generate
with Rd_Addr_r select
Rd_Data <= std_logic_vector(W_i(7 downto 0)) when "11000",
std_logic_vector(W_i(15 downto 8)) when "11001",
std_logic_vector(X_i(7 downto 0)) when "11010",
std_logic_vector(X_i(15 downto 8)) when "11011",
std_logic_vector(Y_i(7 downto 0)) when "11100",
std_logic_vector(Y_i(15 downto 8)) when "11101",
std_logic_vector(Z_i(7 downto 0)) when "11110",
std_logic_vector(Z_i(15 downto 8)) when "11111",
Reg_D_i when others;
with Rr_Addr_r select
Rr_Data <= std_logic_vector(W_i(7 downto 0)) when "11000",
std_logic_vector(W_i(15 downto 8)) when "11001",
std_logic_vector(X_i(7 downto 0)) when "11010",
std_logic_vector(X_i(15 downto 8)) when "11011",
std_logic_vector(Y_i(7 downto 0)) when "11100",
std_logic_vector(Y_i(15 downto 8)) when "11101",
std_logic_vector(Z_i(7 downto 0)) when "11110",
std_logic_vector(Z_i(15 downto 8)) when "11111",
Reg_R_i when others;
end generate;
 
gTri : if TriState generate
Rd_Data <= std_logic_vector(W_i(7 downto 0)) when Rd_Addr_r = "11000" and BigISet else "ZZZZZZZZ";
Rd_Data <= std_logic_vector(W_i(15 downto 8)) when Rd_Addr_r = "11001" and BigISet else "ZZZZZZZZ";
Rd_Data <= std_logic_vector(X_i(7 downto 0)) when Rd_Addr_r = "11010" and BigISet else "ZZZZZZZZ";
Rd_Data <= std_logic_vector(X_i(15 downto 8)) when Rd_Addr_r = "11011" and BigISet else "ZZZZZZZZ";
Rd_Data <= std_logic_vector(Y_i(7 downto 0)) when Rd_Addr_r = "11100" and BigISet else "ZZZZZZZZ";
Rd_Data <= std_logic_vector(Y_i(15 downto 8)) when Rd_Addr_r = "11101" and BigISet else "ZZZZZZZZ";
Rd_Data <= std_logic_vector(Z_i(7 downto 0)) when Rd_Addr_r = "11110" and BigISet else "ZZZZZZZZ";
Rd_Data <= std_logic_vector(Z_i(15 downto 8)) when Rd_Addr_r = "11111" and BigISet else "ZZZZZZZZ";
Rd_Data <= Reg_D_i when not BigISet or (Rd_Addr_r(4 downto 3) /= "11" and BigISet) else "ZZZZZZZZ";
Rr_Data <= std_logic_vector(W_i(7 downto 0)) when Rr_Addr_r = "11000" and BigISet else "ZZZZZZZZ";
Rr_Data <= std_logic_vector(W_i(15 downto 8)) when Rr_Addr_r = "11001" and BigISet else "ZZZZZZZZ";
Rr_Data <= std_logic_vector(X_i(7 downto 0)) when Rr_Addr_r = "11010" and BigISet else "ZZZZZZZZ";
Rr_Data <= std_logic_vector(X_i(15 downto 8)) when Rr_Addr_r = "11011" and BigISet else "ZZZZZZZZ";
Rr_Data <= std_logic_vector(Y_i(7 downto 0)) when Rr_Addr_r = "11100" and BigISet else "ZZZZZZZZ";
Rr_Data <= std_logic_vector(Y_i(15 downto 8)) when Rr_Addr_r = "11101" and BigISet else "ZZZZZZZZ";
Rr_Data <= std_logic_vector(Z_i(7 downto 0)) when Rr_Addr_r = "11110" and BigISet else "ZZZZZZZZ";
Rr_Data <= std_logic_vector(Z_i(15 downto 8)) when Rr_Addr_r = "11111" and BigISet else "ZZZZZZZZ";
Rr_Data <= Reg_R_i when not BigISet or (Rr_Addr_r(4 downto 3) /= "11" and BigISet) else "ZZZZZZZZ";
gTri : if TriState and BigISet generate
Rd_Data <= std_logic_vector(W_i(7 downto 0)) when Rd_Addr_r = "11000" else "ZZZZZZZZ";
Rd_Data <= std_logic_vector(W_i(15 downto 8)) when Rd_Addr_r = "11001" else "ZZZZZZZZ";
Rd_Data <= std_logic_vector(X_i(7 downto 0)) when Rd_Addr_r = "11010" else "ZZZZZZZZ";
Rd_Data <= std_logic_vector(X_i(15 downto 8)) when Rd_Addr_r = "11011" else "ZZZZZZZZ";
Rd_Data <= std_logic_vector(Y_i(7 downto 0)) when Rd_Addr_r = "11100" else "ZZZZZZZZ";
Rd_Data <= std_logic_vector(Y_i(15 downto 8)) when Rd_Addr_r = "11101" else "ZZZZZZZZ";
Rd_Data <= std_logic_vector(Z_i(7 downto 0)) when Rd_Addr_r = "11110" else "ZZZZZZZZ";
Rd_Data <= std_logic_vector(Z_i(15 downto 8)) when Rd_Addr_r = "11111" else "ZZZZZZZZ";
Rd_Data <= Reg_D_i when (Rd_Addr_r(4 downto 3) /= "11") else "ZZZZZZZZ";
Rr_Data <= std_logic_vector(W_i(7 downto 0)) when Rr_Addr_r = "11000" else "ZZZZZZZZ";
Rr_Data <= std_logic_vector(W_i(15 downto 8)) when Rr_Addr_r = "11001" else "ZZZZZZZZ";
Rr_Data <= std_logic_vector(X_i(7 downto 0)) when Rr_Addr_r = "11010" else "ZZZZZZZZ";
Rr_Data <= std_logic_vector(X_i(15 downto 8)) when Rr_Addr_r = "11011" else "ZZZZZZZZ";
Rr_Data <= std_logic_vector(Y_i(7 downto 0)) when Rr_Addr_r = "11100" else "ZZZZZZZZ";
Rr_Data <= std_logic_vector(Y_i(15 downto 8)) when Rr_Addr_r = "11101" else "ZZZZZZZZ";
Rr_Data <= std_logic_vector(Z_i(7 downto 0)) when Rr_Addr_r = "11110" else "ZZZZZZZZ";
Rr_Data <= std_logic_vector(Z_i(15 downto 8)) when Rr_Addr_r = "11111" else "ZZZZZZZZ";
Rr_Data <= Reg_R_i when (Rr_Addr_r(4 downto 3) /= "11") else "ZZZZZZZZ";
end generate;
 
gSmall : if not BigISet generate
Rd_Data <= Reg_D_i;
Rr_Data <= Reg_R_i;
end generate;
 
dpramd : AX_DPRAM
port map(
Clk => Clk,
/trunk/rtl/vhdl/AX_TC16.vhd
1,7 → 1,7
--
-- AT90Sxxxx compatible microcontroller core
--
-- Version : 0146
-- Version : 0221
--
-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
--
45,6 → 45,8
--
-- File history :
--
-- 0146 : First release
-- 0221 : Removed tristate
 
library IEEE;
use IEEE.std_logic_1164.all;
64,7 → 66,14
Rd : in std_logic;
Wr : in std_logic;
Data_In : in std_logic_vector(7 downto 0);
Data_Out : out std_logic_vector(7 downto 0);
COM : out std_logic_vector(1 downto 0);
PWM : out std_logic_vector(1 downto 0);
CRBH : out std_logic_vector(1 downto 0);
CRBL : out std_logic_vector(3 downto 0);
TCNT : out std_logic_vector(15 downto 0);
IC : out std_logic_vector(15 downto 0);
OCR : out std_logic_vector(15 downto 0);
Tmp : out std_logic_vector(15 downto 0);
OC : out std_logic;
Int_TO : out std_logic;
Int_OC : out std_logic;
74,14 → 83,14
 
architecture rtl of AX_TC16 is
 
signal COM : std_logic_vector(1 downto 0);
signal PWM : std_logic_vector(1 downto 0);
signal CRBH : std_logic_vector(1 downto 0); -- ICNC, ICES
signal CRBL : std_logic_vector(3 downto 0); -- CTC, CS
signal TCNT : std_logic_vector(15 downto 0);
signal IC : std_logic_vector(15 downto 0);
signal OCR : std_logic_vector(15 downto 0);
signal TEMP : std_logic_vector(15 downto 0);
signal COM_i : std_logic_vector(1 downto 0);
signal PWM_i : std_logic_vector(1 downto 0);
signal CRBH_i : std_logic_vector(1 downto 0); -- ICNC, ICES
signal CRBL_i : std_logic_vector(3 downto 0); -- CTC, CS
signal TCNT_i : std_logic_vector(15 downto 0);
signal IC_i : std_logic_vector(15 downto 0);
signal OCR_i : std_logic_vector(15 downto 0);
signal Tmp_i : std_logic_vector(15 downto 0);
 
signal OC_i : std_logic;
signal IC_Trig : std_logic;
91,30 → 100,32
 
begin
 
COM <= COM_i;
PWM <= PWM_i;
CRBH <= CRBH_i;
CRBL <= CRBL_i;
TCNT <= TCNT_i;
IC <= IC_i;
OCR(7 downto 0) <= OCR_i(7 downto 0) when PWM_Load = '0' else Tmp_i(7 downto 0);
OCR(15 downto 8) <= OCR_i(15 downto 8);
Tmp <= Tmp_i;
OC <= OC_i;
Int_IC <= IC_Trig;
 
-- Registers and counter
Data_Out <= COM & "0000" & PWM when Rd = '1' and TCCR_Sel = '1' and A0 = '1' else "ZZZZZZZZ";
Data_Out <= CRBH & "00" & CRBL when Rd = '1' and TCCR_Sel = '1' and A0 = '0' else "ZZZZZZZZ";
Data_Out <= TCNT(7 downto 0) when Rd = '1' and TCNT_Sel = '1' and A0 = '0' else "ZZZZZZZZ";
Data_Out <= OCR(7 downto 0) when Rd = '1' and OCR_Sel = '1' and A0 = '0' and PWM_Load = '0' else "ZZZZZZZZ";
Data_Out <= Temp(7 downto 0) when Rd = '1' and OCR_Sel = '1' and A0 = '0' and PWM_Load = '1' else "ZZZZZZZZ";
Data_Out <= IC(7 downto 0) when Rd = '1' and ICR_Sel = '1' and A0 = '0' else "ZZZZZZZZ";
Data_Out <= TEMP(15 downto 8) when Rd = '1' and (TCNT_Sel = '1' or ICR_Sel = '1' or OCR_Sel = '1') and A0 = '1' else "ZZZZZZZZ";
process (Reset_n, Clk)
variable PWM_T : std_logic;
variable PWM_B : std_logic;
begin
if Reset_n = '0' then
COM <= "00";
PWM <= "00";
CRBH <= "00";
CRBL <= "0000";
TCNT <= (others => '0');
OCR <= (others => '0');
IC <= (others => '0');
Temp <= (others => '0');
COM_i <= "00";
PWM_i <= "00";
CRBH_i <= "00";
CRBL_i <= "0000";
TCNT_i <= (others => '0');
OCR_i <= (others => '0');
IC_i <= (others => '0');
Tmp_i <= (others => '0');
OC_i <= '0';
Int_TO <= '0';
Int_OC <= '0';
124,78 → 135,78
Int_TO <= '0';
Int_OC <= '0';
if Tick = '1' then
TCNT <= std_logic_vector(unsigned(TCNT) + 1);
if TCNT = "1111111111111111" then
TCNT_i <= std_logic_vector(unsigned(TCNT_i) + 1);
if TCNT_i = "1111111111111111" then
Int_TO <= '1';
end if;
if TCNT = OCR then
if PWM = "00" then
if TCNT_i = OCR_i then
if PWM_i = "00" then
Int_OC <= '1';
if CRBL(3) = '1' then
TCNT <= (others => '0');
if CRBL_i(3) = '1' then
TCNT_i <= (others => '0');
end if;
if COM = "01" then
if COM_i = "01" then
OC_i <= not OC_i;
end if;
if COM = "10" then
if COM_i = "10" then
OC_i <= '0';
end if;
if COM = "11" then
if COM_i = "11" then
OC_i <= '1';
end if;
end if;
end if;
if PWM /= "00" then
if PWM_i /= "00" then
PWM_T := '0';
PWM_B := '0';
if PWM_Dn = '0' then
TCNT <= std_logic_vector(unsigned(TCNT) + 1);
TCNT_i <= std_logic_vector(unsigned(TCNT_i) + 1);
else
TCNT <= std_logic_vector(unsigned(TCNT) - 1);
TCNT_i <= std_logic_vector(unsigned(TCNT_i) - 1);
end if;
if PWM = "01" and TCNT(7 downto 0) = OCR(7 downto 0) then
OC_i <= COM(0) xor PWM_Dn;
if PWM_i = "01" and TCNT_i(7 downto 0) = OCR_i(7 downto 0) then
OC_i <= COM_i(0) xor PWM_Dn;
end if;
if PWM = "10" and TCNT(8 downto 0) = OCR(8 downto 0) then
OC_i <= COM(0) xor PWM_Dn;
if PWM_i = "10" and TCNT_i(8 downto 0) = OCR_i(8 downto 0) then
OC_i <= COM_i(0) xor PWM_Dn;
end if;
if PWM = "11" and TCNT(9 downto 0) = OCR(9 downto 0) then
OC_i <= COM(0) xor PWM_Dn;
if PWM_i = "11" and TCNT_i(9 downto 0) = OCR_i(9 downto 0) then
OC_i <= COM_i(0) xor PWM_Dn;
end if;
if PWM = "01" then
if TCNT(7 downto 0) = "11111110" and PWM_Dn = '0' then
if PWM_i = "01" then
if TCNT_i(7 downto 0) = "11111110" and PWM_Dn = '0' then
PWM_T := '1';
end if;
if TCNT(7 downto 0) = "00000001" and PWM_Dn = '1' then
if TCNT_i(7 downto 0) = "00000001" and PWM_Dn = '1' then
PWM_B := '1';
end if;
end if;
if PWM = "10" then
if TCNT(8 downto 0) = "111111110" and PWM_Dn = '0' then
if PWM_i = "10" then
if TCNT_i(8 downto 0) = "111111110" and PWM_Dn = '0' then
PWM_T := '1';
end if;
if TCNT(8 downto 0) = "000000001" and PWM_Dn = '1' then
if TCNT_i(8 downto 0) = "000000001" and PWM_Dn = '1' then
PWM_B := '1';
end if;
end if;
if PWM = "11" then
if TCNT(9 downto 0) = "1111111110" and PWM_Dn = '0' then
if PWM_i = "11" then
if TCNT_i(9 downto 0) = "1111111110" and PWM_Dn = '0' then
PWM_T := '1';
end if;
if TCNT(9 downto 0) = "0000000001" and PWM_Dn = '1' then
if TCNT_i(9 downto 0) = "0000000001" and PWM_Dn = '1' then
PWM_B := '1';
end if;
end if;
if PWM_T = '1' then
if PWM_Load = '1' and COM(0) = '0' then
OCR <= Temp;
if PWM_Load = '1' and COM_i(0) = '0' then
OCR_i <= Tmp_i;
PWM_Load <= '0';
end if;
PWM_Dn <= '1';
end if;
if PWM_B = '1' then
if PWM_Load = '1' and COM(0) = '1' then
OCR <= Temp;
if PWM_Load = '1' and COM_i(0) = '1' then
OCR_i <= Tmp_i;
PWM_Load <= '0';
end if;
PWM_Dn <= '0';
204,36 → 215,36
end if;
end if;
if IC_Trig = '1' then
TCNT <= IC;
TCNT_i <= IC_i;
end if;
-- Register read with temp
if Rd = '1' and TCNT_Sel = '1' and A0 = '0' then
Temp(15 downto 8) <= TCNT(15 downto 8);
Tmp_i(15 downto 8) <= TCNT_i(15 downto 8);
end if;
if Rd = '1' and OCR_Sel = '1' and A0 = '0' then
Temp(15 downto 8) <= OCR(15 downto 8);
Tmp_i(15 downto 8) <= OCR_i(15 downto 8);
end if;
if Rd = '1' and ICR_Sel = '1' and A0 = '0' then
Temp(15 downto 8) <= IC(15 downto 8);
Tmp_i(15 downto 8) <= IC_i(15 downto 8);
end if;
-- Register write
if TCNT_Sel = '1' and Wr = '1' then
if A0 = '1' then
Temp(15 downto 8) <= Data_In;
Tmp_i(15 downto 8) <= Data_In;
else
TCNT(7 downto 0) <= Data_In;
TCNT(15 downto 8) <= Temp(15 downto 8);
TCNT_i(7 downto 0) <= Data_In;
TCNT_i(15 downto 8) <= Tmp_i(15 downto 8);
end if;
Int_TO <= '0';
end if;
if OCR_Sel = '1' and Wr = '1' then
if A0 = '1' then
Temp(15 downto 8) <= Data_In;
Tmp_i(15 downto 8) <= Data_In;
else
Temp(7 downto 0) <= Data_In;
if PWM = "00" then
OCR(7 downto 0) <= Data_In;
OCR(15 downto 8) <= Temp(15 downto 8);
Tmp_i(7 downto 0) <= Data_In;
if PWM_i = "00" then
OCR_i(7 downto 0) <= Data_In;
OCR_i(15 downto 8) <= Tmp_i(15 downto 8);
else
PWM_Load <= '1';
end if;
241,19 → 252,19
end if;
if ICR_Sel = '1' and Wr = '1' then
if A0 = '1' then
Temp(15 downto 8) <= Data_In;
Tmp_i(15 downto 8) <= Data_In;
else
IC(7 downto 0) <= Data_In;
IC(15 downto 8) <= Temp(15 downto 8);
IC_i(7 downto 0) <= Data_In;
IC_i(15 downto 8) <= Tmp_i(15 downto 8);
end if;
end if;
if TCCR_Sel = '1' and Wr = '1' and A0 = '1' then
COM <= Data_In(7 downto 6);
PWM <= Data_In(1 downto 0);
COM_i <= Data_In(7 downto 6);
PWM_i <= Data_In(1 downto 0);
end if;
if TCCR_Sel = '1' and Wr = '1' and A0 = '0' then
CRBH <= Data_In(7 downto 6);
CRBL <= Data_In(3 downto 0);
CRBH_i <= Data_In(7 downto 6);
CRBL_i <= Data_In(3 downto 0);
end if;
end if;
end process;
264,18 → 275,18
begin
if Clk'event and Clk = '1' then
IC_Trig <= '0';
if CRBH(1) = '1' then
if Samples = "10000" and CRBH(0) = '0' then
if CRBH_i(1) = '1' then
if Samples = "10000" and CRBH_i(0) = '0' then
IC_Trig <= '1';
end if;
if Samples = "01111" and CRBH(0) = '1' then
if Samples = "01111" and CRBH_i(0) = '1' then
IC_Trig <= '1';
end if;
else
if Samples(1 downto 0) = "10" and CRBH(0) = '0' then
if Samples(1 downto 0) = "10" and CRBH_i(0) = '0' then
IC_Trig <= '1';
end if;
if Samples(1 downto 0) = "01" and CRBH(0) = '1' then
if Samples(1 downto 0) = "01" and CRBH_i(0) = '1' then
IC_Trig <= '1';
end if;
end if;
295,7 → 306,7
T_r := "00";
elsif Clk'event and Clk='1' then
Tick <= '0';
case CRBL(2 downto 0) is
case CRBL_i(2 downto 0) is
when "000" =>
when "001" =>
Tick <= '1';
/trunk/rtl/vhdl/AX_Pack.vhd
1,7 → 1,7
--
-- AT90Sxxxx compatible microcontroller core
--
-- Version : 0221
-- Version : 0221b
--
-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
--
163,11 → 163,13
Sleep_En : in std_logic;
Int_Trig : in std_logic_vector(15 downto 1);
Int_Acc : out std_logic_vector(15 downto 1);
SREG : out std_logic_vector(7 downto 0);
SP : out std_logic_vector(15 downto 0);
IO_Rd : out std_logic;
IO_Wr : out std_logic;
IO_Addr : out std_logic_vector(5 downto 0);
IO_RData : in std_logic_vector(7 downto 0);
IO_WData : out std_logic_vector(7 downto 0);
IO_RData : inout std_logic_vector(7 downto 0);
WDR : out std_logic
);
end component;
176,13 → 178,14
port(
Clk : in std_logic;
Reset_n : in std_logic;
PORT_Sel : std_logic;
DDR_Sel : std_logic;
PIN_Sel : std_logic;
Rd : in std_logic;
PORT_Sel : in std_logic;
DDR_Sel : in std_logic;
PIN_Sel : in std_logic;
Wr : in std_logic;
Data_In : in std_logic_vector(7 downto 0);
Data_Out : out std_logic_vector(7 downto 0);
Dir : out std_logic_vector(7 downto 0);
Port_Input : out std_logic_vector(7 downto 0);
Port_Output : out std_logic_vector(7 downto 0);
IOPort : inout std_logic_vector(7 downto 0)
);
end component;
199,7 → 202,10
Wr : in std_logic;
TXC_Clr : in std_logic;
Data_In : in std_logic_vector(7 downto 0);
Data_Out : out std_logic_vector(7 downto 0);
UDR : out std_logic_vector(7 downto 0);
USR : out std_logic_vector(7 downto 3);
UCR : out std_logic_vector(7 downto 0);
UBRR : out std_logic_vector(7 downto 0);
RXD : in std_logic;
TXD : out std_logic;
Int_RX : out std_logic;
215,10 → 221,10
T : in std_logic;
TCCR_Sel : in std_logic;
TCNT_Sel : in std_logic;
Rd : in std_logic;
Wr : in std_logic;
Data_In : in std_logic_vector(7 downto 0);
Data_Out : out std_logic_vector(7 downto 0);
TCCR : out std_logic_vector(2 downto 0);
TCNT : out std_logic_vector(7 downto 0);
Int : out std_logic
);
end component;
237,7 → 243,14
Rd : in std_logic;
Wr : in std_logic;
Data_In : in std_logic_vector(7 downto 0);
Data_Out : out std_logic_vector(7 downto 0);
COM : out std_logic_vector(1 downto 0);
PWM : out std_logic_vector(1 downto 0);
CRBH : out std_logic_vector(1 downto 0);
CRBL : out std_logic_vector(3 downto 0);
TCNT : out std_logic_vector(15 downto 0);
IC : out std_logic_vector(15 downto 0);
OCR : out std_logic_vector(15 downto 0);
Tmp : out std_logic_vector(15 downto 0);
OC : out std_logic;
Int_TO : out std_logic;
Int_OC : out std_logic;
/trunk/rtl/vhdl/AX_TC8.vhd
1,7 → 1,7
--
-- AT90Sxxxx compatible microcontroller core
--
-- Version : 0146
-- Version : 0221
--
-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
--
44,6 → 44,8
--
-- File history :
--
-- 0146 : First release
-- 0221 : Removed tristate
 
library IEEE;
use IEEE.std_logic_1164.all;
56,10 → 58,10
T : in std_logic;
TCCR_Sel : in std_logic;
TCNT_Sel : in std_logic;
Rd : in std_logic;
Wr : in std_logic;
Data_In : in std_logic_vector(7 downto 0);
Data_Out : out std_logic_vector(7 downto 0);
TCCR : out std_logic_vector(2 downto 0);
TCNT : out std_logic_vector(7 downto 0);
Int : out std_logic
);
end AX_TC8;
66,35 → 68,36
 
architecture rtl of AX_TC8 is
 
signal TCCR : std_logic_vector(2 downto 0); -- Control Register
signal TCNT : std_logic_vector(7 downto 0); -- Timer/Counter
signal TCCR_i : std_logic_vector(2 downto 0); -- Control Register
signal TCNT_i : std_logic_vector(7 downto 0); -- Timer/Counter
 
signal Tick : std_logic;
 
begin
 
TCCR <= TCCR_i;
TCNT <= TCNT_i;
 
-- Registers and counter
Data_Out <= "00000" & TCCR when Rd = '1' and TCCR_Sel = '1' else "ZZZZZZZZ";
Data_Out <= TCNT when Rd = '1' and TCNT_Sel = '1' else "ZZZZZZZZ";
process (Reset_n, Clk)
begin
if Reset_n = '0' then
TCCR <= "000";
TCNT <= "00000000";
TCCR_i<= "000";
TCNT_i <= "00000000";
Int <= '0';
elsif Clk'event and Clk = '1' then
if TCCR_Sel = '1' and Wr = '1' then
TCCR <= Data_In(2 downto 0);
TCCR_i <= Data_In(2 downto 0);
end if;
Int <= '0';
if Tick = '1' then
TCNT <= std_logic_vector(unsigned(TCNT) + 1);
if TCNT = "11111111" then
TCNT_i <= std_logic_vector(unsigned(TCNT_i) + 1);
if TCNT_i = "11111111" then
Int <= '1';
end if;
end if;
if TCNT_Sel = '1' and Wr = '1' then
TCNT <= Data_In;
TCNT_i <= Data_In;
Int <= '0';
end if;
end if;
111,7 → 114,7
T_r := "00";
elsif Clk'event and Clk='1' then
Tick <= '0';
case TCCR is
case TCCR_i is
when "000" =>
when "001" =>
Tick <= '1';
/trunk/rtl/vhdl/AX_Port.vhd
1,7 → 1,7
--
-- AT90Sxxxx compatible microcontroller core
--
-- Version : 0146
-- Version : 0221
--
-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
--
41,10 → 41,12
-- http://www.opencores.org/cvsweb.shtml/t51/
--
-- Limitations :
-- No pull-up (for obvious reasons)
-- No pull-up
--
-- File history :
--
-- 0146 : First release
-- 0221 : Removed tristate
 
library IEEE;
use IEEE.std_logic_1164.all;
53,13 → 55,14
port(
Clk : in std_logic;
Reset_n : in std_logic;
PORT_Sel : std_logic;
DDR_Sel : std_logic;
PIN_Sel : std_logic;
Rd : in std_logic;
PORT_Sel : in std_logic;
DDR_Sel : in std_logic;
PIN_Sel : in std_logic;
Wr : in std_logic;
Data_In : in std_logic_vector(7 downto 0);
Data_Out : out std_logic_vector(7 downto 0);
Dir : out std_logic_vector(7 downto 0);
Port_Input : out std_logic_vector(7 downto 0);
Port_Output : out std_logic_vector(7 downto 0);
IOPort : inout std_logic_vector(7 downto 0)
);
end AX_Port;
66,24 → 69,22
 
architecture rtl of AX_Port is
 
signal Dir : std_logic_vector(7 downto 0);
signal Port_Output : std_logic_vector(7 downto 0);
signal Port_Input : std_logic_vector(7 downto 0);
signal Dir_i : std_logic_vector(7 downto 0);
signal Port_Output_i : std_logic_vector(7 downto 0);
 
begin
 
IOPort(0) <= Port_Output(0) when Dir(0) = '1' else 'Z';
IOPort(1) <= Port_Output(1) when Dir(1) = '1' else 'Z';
IOPort(2) <= Port_Output(2) when Dir(2) = '1' else 'Z';
IOPort(3) <= Port_Output(3) when Dir(3) = '1' else 'Z';
IOPort(4) <= Port_Output(4) when Dir(4) = '1' else 'Z';
IOPort(5) <= Port_Output(5) when Dir(5) = '1' else 'Z';
IOPort(6) <= Port_Output(6) when Dir(6) = '1' else 'Z';
IOPort(7) <= Port_Output(7) when Dir(7) = '1' else 'Z';
Dir <= Dir_i;
Port_Output <= Port_Output_i;
 
Data_Out <= Port_Input when PIN_Sel = '1' and Rd = '1' else "ZZZZZZZZ";
Data_Out <= Dir when DDR_Sel = '1' and Rd = '1' else "ZZZZZZZZ";
Data_Out <= Port_Output when PORT_Sel = '1' and Rd = '1' else "ZZZZZZZZ";
IOPort(0) <= Port_Output_i(0) when Dir_i(0) = '1' else 'Z';
IOPort(1) <= Port_Output_i(1) when Dir_i(1) = '1' else 'Z';
IOPort(2) <= Port_Output_i(2) when Dir_i(2) = '1' else 'Z';
IOPort(3) <= Port_Output_i(3) when Dir_i(3) = '1' else 'Z';
IOPort(4) <= Port_Output_i(4) when Dir_i(4) = '1' else 'Z';
IOPort(5) <= Port_Output_i(5) when Dir_i(5) = '1' else 'Z';
IOPort(6) <= Port_Output_i(6) when Dir_i(6) = '1' else 'Z';
IOPort(7) <= Port_Output_i(7) when Dir_i(7) = '1' else 'Z';
 
process (Clk)
begin
95,14 → 96,14
process (Reset_n, Clk)
begin
if Reset_n = '0' then
Dir <= "00000000";
Port_Output <= "00000000";
Dir_i <= "00000000";
Port_Output_i <= "00000000";
elsif Clk'event and Clk = '1' then
if DDR_Sel = '1' and Wr = '1' then
Dir <= Data_In;
Dir_i <= Data_In;
end if;
if PORT_Sel = '1' and Wr = '1' then
Port_Output <= Data_In;
Port_Output_i <= Data_In;
end if;
end if;
end process;

powered by: WebSVN 2.1.0

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