375 lines
29 KiB
VHDL
375 lines
29 KiB
VHDL
|
ARCHITECTURE mapped OF programRom IS
|
||
|
|
||
|
subtype opCodeType is std_ulogic_vector(5 downto 0);
|
||
|
constant opLoadC : opCodeType := "000000";
|
||
|
constant opLoadR : opCodeType := "000001";
|
||
|
constant opInputC : opCodeType := "000100";
|
||
|
constant opInputR : opCodeType := "000101";
|
||
|
constant opFetchC : opCodeType := "000110";
|
||
|
constant opFetchR : opCodeType := "000111";
|
||
|
constant opAndC : opCodeType := "001010";
|
||
|
constant opAndR : opCodeType := "001011";
|
||
|
constant opOrC : opCodeType := "001100";
|
||
|
constant opOrR : opCodeType := "001101";
|
||
|
constant opXorC : opCodeType := "001110";
|
||
|
constant opXorR : opCodeType := "001111";
|
||
|
constant opTestC : opCodeType := "010010";
|
||
|
constant opTestR : opCodeType := "010011";
|
||
|
constant opCompC : opCodeType := "010100";
|
||
|
constant opCompR : opCodeType := "010101";
|
||
|
constant opAddC : opCodeType := "011000";
|
||
|
constant opAddR : opCodeType := "011001";
|
||
|
constant opAddCyC : opCodeType := "011010";
|
||
|
constant opAddCyR : opCodeType := "011011";
|
||
|
constant opSubC : opCodeType := "011100";
|
||
|
constant opSubR : opCodeType := "011101";
|
||
|
constant opSubCyC : opCodeType := "011110";
|
||
|
constant opSubCyR : opCodeType := "011111";
|
||
|
constant opShRot : opCodeType := "100000";
|
||
|
constant opOutputC : opCodeType := "101100";
|
||
|
constant opOutputR : opCodeType := "101101";
|
||
|
constant opStoreC : opCodeType := "101110";
|
||
|
constant opStoreR : opCodeType := "101111";
|
||
|
|
||
|
subtype shRotCinType is std_ulogic_vector(2 downto 0);
|
||
|
constant shRotLdC : shRotCinType := "00-";
|
||
|
constant shRotLdM : shRotCinType := "01-";
|
||
|
constant shRotLdL : shRotCinType := "10-";
|
||
|
constant shRotLd0 : shRotCinType := "110";
|
||
|
constant shRotLd1 : shRotCinType := "111";
|
||
|
|
||
|
constant registerAddressBitNb : positive := 4;
|
||
|
constant shRotPadLength : positive
|
||
|
:= dataOut'length - opCodeType'length - registerAddressBitNb
|
||
|
- 1 - shRotCinType'length;
|
||
|
subtype shRotDirType is std_ulogic_vector(1+shRotPadLength-1 downto 0);
|
||
|
constant shRotL : shRotDirType := (0 => '0', others => '-');
|
||
|
constant shRotR : shRotDirType := (0 => '1', others => '-');
|
||
|
|
||
|
subtype branchCodeType is std_ulogic_vector(4 downto 0);
|
||
|
constant brRet : branchCodeType := "10101";
|
||
|
constant brCall : branchCodeType := "11000";
|
||
|
constant brJump : branchCodeType := "11010";
|
||
|
constant brReti : branchCodeType := "11100";
|
||
|
constant brEni : branchCodeType := "11110";
|
||
|
|
||
|
subtype branchConditionType is std_ulogic_vector(2 downto 0);
|
||
|
constant brDo : branchConditionType := "000";
|
||
|
constant brZ : branchConditionType := "100";
|
||
|
constant brNZ : branchConditionType := "101";
|
||
|
constant brC : branchConditionType := "110";
|
||
|
constant brNC : branchConditionType := "111";
|
||
|
|
||
|
subtype memoryWordType is std_ulogic_vector(dataOut'range);
|
||
|
type memoryArrayType is array (0 to 2**address'length-1) of memoryWordType;
|
||
|
|
||
|
signal memoryArray : memoryArrayType := (
|
||
|
--===============================================================
|
||
|
-- Beamer control
|
||
|
--===============================================================
|
||
|
--
|
||
|
-----------------------------------------------------------------
|
||
|
-- register definitions
|
||
|
-- s0, s1: used for INPUT and OUTPUT operations
|
||
|
-- S2: returns UART data byte
|
||
|
-- S3: uart protocol checksum
|
||
|
-- S4: uart protocol packet id
|
||
|
-- S5: uart protocol command id
|
||
|
-- S6: uart protocol address
|
||
|
-- S7: uart protocol data
|
||
|
-- S8: copy of UART data byte for debug
|
||
|
-----------------------------------------------------------------
|
||
|
--
|
||
|
-----------------------------------------------------------------
|
||
|
-- GPIO definitions
|
||
|
-----------------------------------------------------------------
|
||
|
-----------------------------------------------------------------
|
||
|
-- UART definitions
|
||
|
-----------------------------------------------------------------
|
||
|
-- CONSTANT uartBaudCount, 023D ; 66E6 / 115 200 = 573
|
||
|
-- CONSTANT uartpollDelay, 0100
|
||
|
-----------------------------------------------------------------
|
||
|
-- beamer peripheral definitions
|
||
|
-----------------------------------------------------------------
|
||
|
-- CONSTANT beamerCtlInit, 1001
|
||
|
--
|
||
|
--===============================================================
|
||
|
-- initializations
|
||
|
--===============================================================
|
||
|
--
|
||
|
-----------------------------------------------------------------
|
||
|
-- initialize GPIO
|
||
|
-----------------------------------------------------------------
|
||
|
16#000# => opLoadC & "0000" & "0000000000000000", -- LOAD s0, 0000
|
||
|
16#001# => opAddC & "0000" & "0000000000000000", -- ADD s0, 0000
|
||
|
16#002# => opLoadC & "0001" & "0000000010101010", -- LOAD s1, AA
|
||
|
16#003# => opOutputR & "0001" & "0000------------", -- OUTPUT s1, (S0)
|
||
|
16#004# => opLoadC & "0000" & "0000000000000000", -- LOAD s0, 0000
|
||
|
16#005# => opAddC & "0000" & "0000000000000001", -- ADD s0, 0001
|
||
|
16#006# => opLoadC & "0001" & "0000000000001111", -- LOAD s1, 0F
|
||
|
16#007# => opOutputR & "0001" & "0000------------", -- OUTPUT s1, (S0)
|
||
|
-----------------------------------------------------------------
|
||
|
-- initialize UART
|
||
|
-----------------------------------------------------------------
|
||
|
16#008# => opLoadC & "0000" & "0000000000010000", -- LOAD s0, 0010
|
||
|
16#009# => opAddC & "0000" & "0000000000000010", -- ADD s0, 0002
|
||
|
16#00A# => opLoadC & "0001" & "0000000001000010", -- LOAD s1, 0042
|
||
|
16#00B# => opOutputR & "0001" & "0000------------", -- OUTPUT s1, (S0)
|
||
|
-----------------------------------------------------------------
|
||
|
-- initialize beamer peripheral
|
||
|
-----------------------------------------------------------------
|
||
|
16#00C# => opLoadC & "0000" & "0000000000100000", -- LOAD s0, 0020
|
||
|
16#00D# => opAddC & "0000" & "0000000000000000", -- ADD s0, 0000
|
||
|
16#00E# => opLoadC & "0001" & "0000010000000001", -- LOAD s1, 0401
|
||
|
16#00F# => opOutputR & "0001" & "0000------------", -- OUTPUT s1, (S0)
|
||
|
16#010# => opLoadC & "0000" & "0000000000100000", -- LOAD s0, 0020
|
||
|
16#011# => opAddC & "0000" & "0000000000000001", -- ADD s0, 0001
|
||
|
16#012# => opLoadC & "0001" & "0000000000000100", -- LOAD s1, 0004
|
||
|
16#013# => opOutputR & "0001" & "0000------------", -- OUTPUT s1, (S0)
|
||
|
--
|
||
|
--===============================================================
|
||
|
-- Main loop
|
||
|
--===============================================================
|
||
|
--
|
||
|
-----------------------------------------------------------------
|
||
|
-- Process commands from serial port
|
||
|
-----------------------------------------------------------------
|
||
|
-- _main_:
|
||
|
16#014# => brCall & brDo & "--------0000100001",-- CALL 021 ; get command from UART
|
||
|
16#015# => opCompC & "0011" & "0000000000000000", -- COMPARE s3, 0000 ; check function return
|
||
|
16#016# => brJump & brNZ & "--------0000011111",-- JUMP NZ, 01F
|
||
|
16#017# => opCompC & "0101" & "0000000000000011", -- COMPARE s5, 0003 ; check for WRITE_MEM command
|
||
|
16#018# => brJump & brNZ & "--------0000011100",-- JUMP NZ, 01C
|
||
|
16#019# => opOutputR & "0111" & "0110------------", -- OUTPUT s7, (S6) ; write word to memory location
|
||
|
16#01A# => brCall & brDo & "--------0001100000",-- CALL 060 ; send write acknowledge
|
||
|
16#01B# => brJump & brDo & "--------0000010100",-- JUMP 014
|
||
|
-- _commandRead_:
|
||
|
16#01C# => opInputR & "0111" & "0110------------", -- INPUT s7, (S6) ; write word in memory location
|
||
|
16#01D# => brCall & brDo & "--------0001101111",-- CALL 06F ; send back read data
|
||
|
16#01E# => brJump & brDo & "--------0000010100",-- JUMP 014
|
||
|
-- _commandAbort_:
|
||
|
16#01F# => brCall & brDo & "--------0001010001",-- CALL 051
|
||
|
16#020# => brJump & brDo & "--------0000010100",-- JUMP 014
|
||
|
--
|
||
|
--===============================================================
|
||
|
-- Subroutines
|
||
|
--===============================================================
|
||
|
--
|
||
|
-----------------------------------------------------------------
|
||
|
-- Get command from serial port
|
||
|
-----------------------------------------------------------------
|
||
|
-- _uartGetCmd_:
|
||
|
16#021# => brCall & brDo & "--------0010000110",-- CALL 086 ; get command header
|
||
|
16#022# => opCompC & "0010" & "0000000010101010", -- COMPARE s2, 00AA
|
||
|
16#023# => brJump & brNZ & "--------0000100001",-- JUMP NZ, 021 ; loop until byte is AAh
|
||
|
16#024# => opLoadR & "0011" & "0010------------", -- LOAD s3, s2 ; prepare checksum
|
||
|
16#025# => brCall & brDo & "--------0010000110",-- CALL 086 ; get packet id
|
||
|
16#026# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
||
|
16#027# => opLoadR & "0100" & "0010------------", -- LOAD s4, s2 ; store id for reply
|
||
|
16#028# => brCall & brDo & "--------0010000110",-- CALL 086 ; get command
|
||
|
16#029# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
||
|
16#02A# => opCompC & "0010" & "0000000000000011", -- COMPARE s2, 0003 ; check for WRITE_MEM command
|
||
|
16#02B# => brJump & brZ & "--------0000101111",-- JUMP Z, 02F
|
||
|
16#02C# => opCompC & "0010" & "0000000000000100", -- COMPARE s2, 0004 ; check for READ_MEM command
|
||
|
16#02D# => brJump & brZ & "--------0000101111",-- JUMP Z, 02F
|
||
|
16#02E# => brJump & brDo & "--------0001001111",-- JUMP 04F ; no match
|
||
|
-- _commandOk_:
|
||
|
16#02F# => opLoadR & "0101" & "0010------------", -- LOAD s5, s2 ; store command for action
|
||
|
16#030# => brCall & brDo & "--------0010000110",-- CALL 086 ; get data length
|
||
|
16#031# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
||
|
16#032# => opCompC & "0101" & "0000000000000011", -- COMPARE s5, 0003 ; check for WRITE_MEM command
|
||
|
16#033# => brJump & brZ & "--------0000110111",-- JUMP Z, 037 ; go to test write command length
|
||
|
16#034# => opCompC & "0010" & "0000000000000010", -- COMPARE s2, 0002 ; verify READ_MEM length
|
||
|
16#035# => brJump & brNZ & "--------0001001111",-- JUMP NZ, 04F
|
||
|
16#036# => brJump & brDo & "--------0000111001",-- JUMP 039
|
||
|
-- _testWrLength_:
|
||
|
16#037# => opCompC & "0010" & "0000000000000100", -- COMPARE s2, 0004 ; verify WRITE_MEM length
|
||
|
16#038# => brJump & brNZ & "--------0001001111",-- JUMP NZ, 04F
|
||
|
-- _getAddress_:
|
||
|
16#039# => brCall & brDo & "--------0010000110",-- CALL 086 ; get address low
|
||
|
16#03A# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
||
|
16#03B# => opLoadR & "0110" & "0010------------", -- LOAD s6, s2 ; store address low
|
||
|
16#03C# => brCall & brDo & "--------0010000110",-- CALL 086 ; get address high
|
||
|
16#03D# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
||
|
16#03E# => brCall & brDo & "--------0010100000",-- CALL 0A0
|
||
|
16#03F# => opAddR & "0110" & "0010------------", -- ADD s6, s2 ; build address from low and high
|
||
|
16#040# => opCompC & "0101" & "0000000000000100", -- COMPARE s5, 0004 ; check for READ_MEM command
|
||
|
16#041# => brJump & brZ & "--------0001001001",-- JUMP Z, 049 ; skip reading data word
|
||
|
16#042# => brCall & brDo & "--------0010000110",-- CALL 086 ; get data low
|
||
|
16#043# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
||
|
16#044# => opLoadR & "0111" & "0010------------", -- LOAD s7, s2 ; store data low
|
||
|
16#045# => brCall & brDo & "--------0010000110",-- CALL 086 ; get data high
|
||
|
16#046# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
||
|
16#047# => brCall & brDo & "--------0010100000",-- CALL 0A0
|
||
|
16#048# => opAddR & "0111" & "0010------------", -- ADD s7, s2 ; build data from low and high
|
||
|
-- _getChecksum_:
|
||
|
16#049# => brCall & brDo & "--------0010000110",-- CALL 086 ; get checksum
|
||
|
16#04A# => opAndC & "0011" & "0000000011111111", -- AND s3, 00FF ; limit calculated checksum to 8 bit
|
||
|
16#04B# => opCompR & "0011" & "0010------------", -- COMPARE s3, s2 ; test checksum
|
||
|
16#04C# => brJump & brNZ & "--------0001001111",-- JUMP NZ, 04F
|
||
|
16#04D# => opLoadC & "0011" & "0000000000000000", -- LOAD s3, 0000 ; return OK
|
||
|
16#04E# => brRet & brDo & "------------------",-- RETURN
|
||
|
-- _commandKo_:
|
||
|
16#04F# => opLoadC & "0011" & "0000000000000001", -- LOAD s3, 0001 ; return KO
|
||
|
16#050# => brRet & brDo & "------------------",-- RETURN
|
||
|
--
|
||
|
-----------------------------------------------------------------
|
||
|
-- send NACK reply
|
||
|
-----------------------------------------------------------------
|
||
|
-- _sendNAck_:
|
||
|
16#051# => opLoadC & "0010" & "0000000010101010", -- LOAD s2, 00AA ; send header
|
||
|
16#052# => opLoadR & "0011" & "0010------------", -- LOAD s3, s2 ; prepare checksum
|
||
|
16#053# => brCall & brDo & "--------0010010011",-- CALL 093
|
||
|
16#054# => opLoadR & "0010" & "0100------------", -- LOAD s2, s4 ; packet id
|
||
|
16#055# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
||
|
16#056# => brCall & brDo & "--------0010010011",-- CALL 093
|
||
|
16#057# => opLoadC & "0010" & "0000000000000000", -- LOAD s2, 0000 ; negative Acknowledge
|
||
|
16#058# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
||
|
16#059# => brCall & brDo & "--------0010010011",-- CALL 093
|
||
|
16#05A# => opLoadC & "0010" & "0000000000000000", -- LOAD s2, 0000 ; packet length: no data
|
||
|
16#05B# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
||
|
16#05C# => brCall & brDo & "--------0010010011",-- CALL 093
|
||
|
16#05D# => opLoadR & "0010" & "0011------------", -- LOAD s2, s3 ; checksum
|
||
|
16#05E# => brCall & brDo & "--------0010010011",-- CALL 093
|
||
|
16#05F# => brRet & brDo & "------------------",-- RETURN
|
||
|
--
|
||
|
-----------------------------------------------------------------
|
||
|
-- send WRITE_MEM reply
|
||
|
-----------------------------------------------------------------
|
||
|
-- _sendWriteOk_:
|
||
|
16#060# => opLoadC & "0010" & "0000000010101010", -- LOAD s2, 00AA ; send header
|
||
|
16#061# => opLoadR & "0011" & "0010------------", -- LOAD s3, s2 ; prepare checksum
|
||
|
16#062# => brCall & brDo & "--------0010010011",-- CALL 093
|
||
|
16#063# => opLoadR & "0010" & "0100------------", -- LOAD s2, s4 ; packet id
|
||
|
16#064# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
||
|
16#065# => brCall & brDo & "--------0010010011",-- CALL 093
|
||
|
16#066# => opLoadR & "0010" & "0101------------", -- LOAD s2, s5 ; received command
|
||
|
16#067# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
||
|
16#068# => brCall & brDo & "--------0010010011",-- CALL 093
|
||
|
16#069# => opLoadC & "0010" & "0000000000000000", -- LOAD s2, 0000 ; packet length: no data
|
||
|
16#06A# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
||
|
16#06B# => brCall & brDo & "--------0010010011",-- CALL 093
|
||
|
16#06C# => opLoadR & "0010" & "0011------------", -- LOAD s2, s3 ; checksum
|
||
|
16#06D# => brCall & brDo & "--------0010010011",-- CALL 093
|
||
|
16#06E# => brRet & brDo & "------------------",-- RETURN
|
||
|
--
|
||
|
-----------------------------------------------------------------
|
||
|
-- send READ_MEM reply
|
||
|
-----------------------------------------------------------------
|
||
|
-- _sendReadData_:
|
||
|
16#06F# => opLoadC & "0010" & "0000000010101010", -- LOAD s2, 00AA ; send header
|
||
|
16#070# => opLoadR & "0011" & "0010------------", -- LOAD s3, s2 ; prepare checksum
|
||
|
16#071# => brCall & brDo & "--------0010010011",-- CALL 093
|
||
|
16#072# => opLoadR & "0010" & "0100------------", -- LOAD s2, s4 ; packet id
|
||
|
16#073# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
||
|
16#074# => brCall & brDo & "--------0010010011",-- CALL 093
|
||
|
16#075# => opLoadR & "0010" & "0101------------", -- LOAD s2, s5 ; received command
|
||
|
16#076# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
||
|
16#077# => brCall & brDo & "--------0010010011",-- CALL 093
|
||
|
16#078# => opLoadC & "0010" & "0000000000000010", -- LOAD s2, 0002 ; packet length: 2 bytes
|
||
|
16#079# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
||
|
16#07A# => brCall & brDo & "--------0010010011",-- CALL 093
|
||
|
16#07B# => opLoadR & "0010" & "0111------------", -- LOAD s2, s7 ; data low
|
||
|
16#07C# => opAndC & "0010" & "0000000011111111", -- AND s2, 00FF ; keep low byte only
|
||
|
16#07D# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
||
|
16#07E# => brCall & brDo & "--------0010010011",-- CALL 093
|
||
|
16#07F# => opLoadR & "0010" & "0111------------", -- LOAD s2, s7 ; data high
|
||
|
16#080# => brCall & brDo & "--------0010100101",-- CALL 0A5 ; shift MSBs down to LSBs
|
||
|
16#081# => opAddR & "0011" & "0010------------", -- ADD s3, s2 ; calculate checksum
|
||
|
16#082# => brCall & brDo & "--------0010010011",-- CALL 093
|
||
|
16#083# => opLoadR & "0010" & "0011------------", -- LOAD s2, s3 ; checksum
|
||
|
16#084# => brCall & brDo & "--------0010010011",-- CALL 093
|
||
|
16#085# => brRet & brDo & "------------------",-- RETURN
|
||
|
--
|
||
|
-----------------------------------------------------------------
|
||
|
-- Get byte from serial port
|
||
|
-----------------------------------------------------------------
|
||
|
-- _uartGetByte_:
|
||
|
16#086# => opLoadC & "0000" & "0000000000010000", -- LOAD s0, 0010 ; read UART satus register
|
||
|
16#087# => opAddC & "0000" & "0000000000000001", -- ADD s0, 01
|
||
|
--load s8, 0100
|
||
|
-- _checkStat_:
|
||
|
16#088# => opLoadC & "0010" & "0000000001000000", -- LOAD s2, 0040 ; add delay between bus reads
|
||
|
-- _delay0_:
|
||
|
16#089# => opSubC & "0010" & "0000000000000001", -- SUB s2, 0001
|
||
|
16#08A# => brJump & brNZ & "--------0010001001",-- JUMP NZ, 089
|
||
|
--sub s8, 0001
|
||
|
--jump nz, continue
|
||
|
--load s2, 0035
|
||
|
--call uartSendByte
|
||
|
--load s8, 0100
|
||
|
-- _continue_:
|
||
|
16#08B# => opInputR & "0001" & "0000------------", -- INPUT s1, (S0)
|
||
|
16#08C# => opInputR & "0001" & "0000------------", -- INPUT s1, (S0)
|
||
|
16#08D# => opTestC & "0001" & "0000000000000001", -- TEST s1, 0001 ; check "data ready" bit
|
||
|
16#08E# => brJump & brZ & "--------0010001000",-- JUMP Z, 088 ; loop until bit is '1'
|
||
|
16#08F# => opLoadC & "0000" & "0000000000010000", -- LOAD s0, 0010 ; read UART data register
|
||
|
16#090# => opInputR & "0010" & "0000------------", -- INPUT s2, (S0)
|
||
|
16#091# => opInputR & "0010" & "0000------------", -- INPUT s2, (S0)
|
||
|
--LOAD s8, s2
|
||
|
16#092# => brRet & brDo & "------------------",-- RETURN
|
||
|
--
|
||
|
-----------------------------------------------------------------
|
||
|
-- Send byte to serial port
|
||
|
-----------------------------------------------------------------
|
||
|
-- _uartSendByte_:
|
||
|
16#093# => opLoadC & "0000" & "0000000000010000", -- LOAD s0, 0010 ; read UART satus register
|
||
|
16#094# => opAddC & "0000" & "0000000000000001", -- ADD s0, 0001
|
||
|
-- _readStatus_:
|
||
|
16#095# => opInputR & "0001" & "0000------------", -- INPUT s1, (S0)
|
||
|
16#096# => opInputR & "0001" & "0000------------", -- INPUT s1, (S0)
|
||
|
16#097# => opTestC & "0001" & "0000000000000010", -- TEST s1, 0002 ; check "sending data" bit
|
||
|
16#098# => brJump & brZ & "--------0010011101",-- JUMP Z, 09D ; loop until bit is '1'
|
||
|
16#099# => opLoadC & "0001" & "0000000001000000", -- LOAD s1, 0040 ; add delay between bus reads
|
||
|
-- _delay1_:
|
||
|
16#09A# => opSubC & "0001" & "0000000000000001", -- SUB s1, 0001
|
||
|
16#09B# => brJump & brNZ & "--------0010011010",-- JUMP NZ, 09A
|
||
|
16#09C# => brJump & brDo & "--------0010010101",-- JUMP 095
|
||
|
-- _sendByte_:
|
||
|
16#09D# => opLoadC & "0000" & "0000000000010000", -- LOAD s0, 0010 ; write UART data register
|
||
|
16#09E# => opOutputR & "0010" & "0000------------", -- OUTPUT s2, (S0)
|
||
|
16#09F# => brRet & brDo & "------------------",-- RETURN
|
||
|
--
|
||
|
-----------------------------------------------------------------
|
||
|
-- shift s2 8 bits to the left
|
||
|
-----------------------------------------------------------------
|
||
|
-- _shiftS2L8_:
|
||
|
16#0A0# => opLoadC & "0000" & "0000000000001000", -- LOAD s0, 8 ; loop count
|
||
|
-- _shiftLeftLoop_:
|
||
|
16#0A1# => opShRot & "0010" & shRotL & shRotLd0, -- SL0 s2
|
||
|
16#0A2# => opSubC & "0000" & "0000000000000001", -- SUB s0, 0001
|
||
|
16#0A3# => brJump & brNZ & "--------0010100001",-- JUMP NZ, 0A1
|
||
|
16#0A4# => brRet & brDo & "------------------",-- RETURN
|
||
|
--
|
||
|
-----------------------------------------------------------------
|
||
|
-- shift s2 8 bits to the right
|
||
|
-----------------------------------------------------------------
|
||
|
-- _shiftS2R8_:
|
||
|
16#0A5# => opLoadC & "0000" & "0000000000001000", -- LOAD s0, 8 ; loop count
|
||
|
-- _shiftRightLoop_:
|
||
|
16#0A6# => opShRot & "0010" & shRotR & shRotLd0, -- SR0 s2
|
||
|
16#0A7# => opSubC & "0000" & "0000000000000001", -- SUB s0, 0001
|
||
|
16#0A8# => brJump & brNZ & "--------0010100110",-- JUMP NZ, 0A6
|
||
|
16#0A9# => brRet & brDo & "------------------",-- RETURN
|
||
|
--
|
||
|
--===============================================================
|
||
|
-- End of instruction memory
|
||
|
--===============================================================
|
||
|
-- _endOfMemory_:
|
||
|
16#3FF# => brJump & brDo & "--------1111111111",-- JUMP 3FF
|
||
|
others => (others => '0')
|
||
|
);
|
||
|
|
||
|
BEGIN
|
||
|
|
||
|
process (clock)
|
||
|
begin
|
||
|
if rising_edge(clock) then
|
||
|
if en = '1' then
|
||
|
dataOut <= memoryArray(to_integer(address));
|
||
|
end if;
|
||
|
end if;
|
||
|
end process;
|
||
|
|
||
|
END ARCHITECTURE mapped;
|