Difference between revisions of "IOP16 Constants Unit"

From Land Boards Wiki
Jump to navigation Jump to search
 
(18 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
== Constants ROM with Address Counter ==
 
== Constants ROM with Address Counter ==
  
A constants ROM can be used to store strings. This is useful for printing strings.
+
A Constants ROM can be used to store strings. This is useful for printing strings to the VDU and UART.
  
 
* Constants ROM
 
* Constants ROM
 
** 256-byte (max)
 
** 256-byte (max)
** Null terminated strings
+
** Null-terminated strings
** ROM "assembler"
+
** ROM "assembler" creates .MIF file and Symbol table
* Address Counter
+
* 8-bit Address Counter
 
** Loadable with start address
 
** Loadable with start address
 
** Auto-increment address
 
** Auto-increment address
Line 13: Line 13:
 
== Programming ==
 
== Programming ==
  
* Load start address (W)
+
* Single address from the IOP Peripheral spave
* Read Data
+
* Load transfer start address (W)
 +
* Read Data (R)
  
 
== Hook-up ==
 
== Hook-up ==
Line 38: Line 39:
  
 
=== VHDL Instance ===
 
=== VHDL Instance ===
 +
 +
* Add this entity instance code to the IOP16 top file
  
 
<pre>
 
<pre>
Line 43: Line 46:
 
CONST_UNIT : entity work.ConstantsUnit
 
CONST_UNIT : entity work.ConstantsUnit
 
port map (
 
port map (
   i_clock    => i_clk,
+
   i_clock    => i_clk,       -- 50 MHz clock
   i_dataIn    => w_periphOut,
+
   i_dataIn    => w_periphOut, -- Data from IOP CPU
   i_ldStr    => w_ldConAdr,
+
   i_ldStr    => w_ldConAdr, -- Write load address strobe
   i_rdStr    => w_rdConAdr,
+
   i_rdStr    => w_rdConAdr, -- Strobe to read data from ROM
   o_constData => w_ConstsData
+
   o_constData => w_ConstsData -- Data from ROM
 
);
 
);
 
</pre>
 
</pre>
Line 53: Line 56:
 
=== Hook-up Strobes/Read Mux ===
 
=== Hook-up Strobes/Read Mux ===
  
* Add to strobes and read mux
+
* Strobes
 +
 
 +
<pre>
 +
-- Add Strobes/Selects
 +
..
 +
  w_ldConAdr <= '1' when (w_periphAdr=x"0E") and (w_periphWr = '1') else '0';
 +
  w_rdConAdr <= '1' when (w_periphAdr=x"0E") and (w_periphRd = '1') else '0';
 +
...
 +
</pre>
 +
 
 +
Add to Read Mux
 +
 
 +
<pre>
 +
-- Peripheral bus read mux
 +
  w_periphIn <= ...
 +
    w_ConstsData when w_periphAdr = x"0E" else -- Read Constants ROM
 +
...
 +
</pre>
  
 
== Constants Compiler ==
 
== Constants Compiler ==
Line 60: Line 80:
 
** Python 3
 
** Python 3
 
** Prompts for input file
 
** Prompts for input file
Creates two output files
+
* Creates two output files
 
** Cross reference list of LABEL, address
 
** Cross reference list of LABEL, address
 
** .MIF file with ROM contents
 
** .MIF file with ROM contents
Line 66: Line 86:
 
* Input file is CSV
 
* Input file is CSV
 
** Header line - ['LABEL','STRING']
 
** Header line - ['LABEL','STRING']
 +
 +
=== Constants Subroutine ===
 +
 +
* Routine handles constants
 +
* Sets constants address
 +
* Reads from constants ROM
 +
* Writes to VDU
 +
 +
<pre>
 +
PRSTR IOW 0X01 0X0E LOAD CONSTANTS ADDRESS
 +
PRSTR2 IOR 0X01 0X0E READ CHAR (NEXT)
 +
CMP 0X01 0X00 IS END OF STRING?
 +
BNE SKIPPS NOT END OF STRING
 +
RTS RETURN IF END
 +
SKIPPS JSR WR2VDU PRINT TO VDU
 +
JMP PRSTR2 LOOP UNTIL NULL TERM
 +
</pre>
  
 
== Resources ==
 
== Resources ==

Latest revision as of 12:01, 15 April 2022

Constants ROM with Address Counter

A Constants ROM can be used to store strings. This is useful for printing strings to the VDU and UART.

  • Constants ROM
    • 256-byte (max)
    • Null-terminated strings
    • ROM "assembler" creates .MIF file and Symbol table
  • 8-bit Address Counter
    • Loadable with start address
    • Auto-increment address

Programming

  • Single address from the IOP Peripheral spave
  • Load transfer start address (W)
  • Read Data (R)

Hook-up

  • Add to Top Level VHDL code

Pins

  • None - all internal

Signals

-- Decodes/Strobes
...
  signal w_ldConAdr				:	std_logic;
  signal w_rdConAdr				:	std_logic;
...
-- Interfaces
...
signal w_ConstsData			:	std_logic_vector(7 downto 0);

VHDL Instance

  • Add this entity instance code to the IOP16 top file
-- Constants Unit
CONST_UNIT : entity work.ConstantsUnit
port map (	
  i_clock     => i_clk,       -- 50 MHz clock
  i_dataIn    => w_periphOut, -- Data from IOP CPU
  i_ldStr     => w_ldConAdr,  -- Write load address strobe
  i_rdStr     => w_rdConAdr,  -- Strobe to read data from ROM
  o_constData => w_ConstsData -- Data from ROM
);

Hook-up Strobes/Read Mux

  • Strobes
-- Add Strobes/Selects
..
  w_ldConAdr <= '1' when (w_periphAdr=x"0E") and (w_periphWr = '1') else '0';
  w_rdConAdr <= '1' when (w_periphAdr=x"0E") and (w_periphRd = '1') else '0';
...
  • Add to Read Mux
-- Peripheral bus read mux
  w_periphIn <=	...
    w_ConstsData when w_periphAdr = x"0E" else -- Read Constants ROM
...

Constants Compiler

  • Program - pyConstants_cpu_001.py
    • Python 3
    • Prompts for input file
  • Creates two output files
    • Cross reference list of LABEL, address
    • .MIF file with ROM contents
      • Load ROM file by double-clickjng ConstantsROM_256B below ConstantsUnit
  • Input file is CSV
    • Header line - ['LABEL','STRING']

Constants Subroutine

  • Routine handles constants
  • Sets constants address
  • Reads from constants ROM
  • Writes to VDU
PRSTR	IOW	0X01	0X0E	LOAD CONSTANTS ADDRESS
PRSTR2	IOR	0X01	0X0E	READ CHAR (NEXT)
	CMP	0X01	0X00	IS END OF STRING?
	BNE	SKIPPS		NOT END OF STRING
	RTS			RETURN IF END
SKIPPS	JSR	WR2VDU		PRINT TO VDU
	JMP	PRSTR2		LOOP UNTIL NULL TERM

Resources

  • Logic Cells: 74
  • Registers: 46
  • Memory Bits: 2048
  • M9Ks: 1