URL
https://opencores.org/ocsvn/ion/ion/trunk
Subversion Repositories ion
Compare Revisions
- This comparison shows the changes necessary to convert path
/ion/trunk
- from Rev 214 to Rev 215
- ↔ Reverse comparison
Rev 214 → Rev 215
/vhdl/SoC/bootstrap_code_pkg.vhdl
0,0 → 1,507
-------------------------------------------------------------------------------- |
-- obj_code_pkg.vhdl -- Application object code in vhdl constant string format. |
-------------------------------------------------------------------------------- |
-- This file contains object code in the form of a VHDL byte table constant. |
-- This constant can be used to initialize FPGA memories for synthesis or |
-- simulation. |
-- Note that the object code is stored as a plain byte table in byte address |
-- order. This table knows nothing of data endianess and can be used to |
-- initialize 32-, 16- or 8-bit-wide memory -- memory initialization functions |
-- can be found in package mips_pkg. |
-------------------------------------------------------------------------------- |
-- Copyright (C) 2012 Jose A. Ruiz |
-- |
-- This source file may be used and distributed without |
-- restriction provided that this copyright statement is not |
-- removed from the file and that any derivative work contains |
-- the original copyright notice and the associated disclaimer. |
-- |
-- This source file is free software; you can redistribute it |
-- and/or modify it under the terms of the GNU Lesser General |
-- Public License as published by the Free Software Foundation; |
-- either version 2.1 of the License, or (at your option) any |
-- later version. |
-- |
-- This source is distributed in the hope that it will be |
-- useful, but WITHOUT ANY WARRANTY; without even the implied |
-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
-- PURPOSE. See the GNU Lesser General Public License for more |
-- details. |
-- |
-- You should have received a copy of the GNU Lesser General |
-- Public License along with this source; if not, download it |
-- from http://www.opencores.org/lgpl.shtml |
-------------------------------------------------------------------------------- |
|
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.numeric_std.all; |
use work.mips_pkg.all; |
|
package obj_code_pkg is |
|
constant obj_code : t_obj_code(0 to 3678) := ( |
X"10", X"00", X"00", X"7c", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"40", X"1a", X"68", X"00", X"00", X"1a", X"d0", X"82", |
X"33", X"5a", X"00", X"1f", X"34", X"1b", X"00", X"08", |
X"13", X"5b", X"00", X"09", X"23", X"7b", X"00", X"01", |
X"13", X"5b", X"00", X"05", X"23", X"7b", X"00", X"01", |
X"17", X"5b", X"00", X"07", X"00", X"00", X"00", X"00", |
X"0b", X"f0", X"00", X"a2", X"00", X"00", X"00", X"00", |
X"0b", X"f0", X"00", X"72", X"00", X"00", X"00", X"00", |
X"0b", X"f0", X"00", X"72", X"00", X"00", X"00", X"00", |
X"0b", X"f0", X"00", X"72", X"00", X"00", X"00", X"00", |
X"40", X"1b", X"70", X"00", X"40", X"1a", X"68", X"00", |
X"00", X"1a", X"d7", X"c2", X"33", X"5a", X"00", X"01", |
X"17", X"40", X"00", X"03", X"23", X"7b", X"00", X"04", |
X"03", X"60", X"00", X"08", X"00", X"00", X"00", X"00", |
X"23", X"7b", X"00", X"04", X"03", X"60", X"00", X"08", |
X"42", X"00", X"00", X"10", X"40", X"04", X"60", X"00", |
X"30", X"84", X"ff", X"fe", X"40", X"84", X"60", X"00", |
X"0f", X"f0", X"00", X"86", X"00", X"00", X"00", X"00", |
X"3c", X"04", X"bf", X"c0", X"24", X"84", X"06", X"b4", |
X"00", X"80", X"00", X"08", X"00", X"00", X"00", X"00", |
X"3c", X"05", X"00", X"01", X"40", X"04", X"60", X"00", |
X"30", X"84", X"ff", X"ff", X"00", X"85", X"28", X"25", |
X"40", X"85", X"60", X"00", X"24", X"04", X"00", X"00", |
X"24", X"06", X"00", X"00", X"24", X"05", X"00", X"ff", |
X"ac", X"86", X"00", X"00", X"00", X"c5", X"08", X"2a", |
X"14", X"20", X"ff", X"fd", X"20", X"c6", X"00", X"01", |
X"24", X"04", X"00", X"00", X"24", X"06", X"00", X"00", |
X"24", X"05", X"00", X"ff", X"8c", X"80", X"00", X"00", |
X"20", X"84", X"00", X"10", X"00", X"c5", X"08", X"2a", |
X"14", X"20", X"ff", X"fc", X"20", X"c6", X"00", X"01", |
X"3c", X"05", X"00", X"02", X"40", X"04", X"60", X"00", |
X"30", X"84", X"ff", X"ff", X"00", X"85", X"28", X"25", |
X"03", X"e0", X"00", X"08", X"40", X"85", X"60", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"3c", X"1b", X"00", X"00", X"27", X"7b", X"00", X"3c", |
X"af", X"7d", X"ff", X"f0", X"af", X"7f", X"ff", X"ec", |
X"af", X"68", X"ff", X"e8", X"af", X"69", X"ff", X"e4", |
X"af", X"6a", X"ff", X"e0", X"03", X"60", X"e8", X"21", |
X"40", X"08", X"70", X"00", X"8d", X"1a", X"00", X"00", |
X"40", X"1b", X"68", X"00", X"07", X"70", X"00", X"2d", |
X"00", X"00", X"00", X"00", X"00", X"1a", X"4e", X"82", |
X"39", X"28", X"00", X"1f", X"11", X"00", X"00", X"1f", |
X"39", X"28", X"00", X"1c", X"11", X"00", X"00", X"13", |
X"00", X"00", X"00", X"00", X"3c", X"08", X"20", X"01", |
X"ad", X"1a", X"04", X"00", X"8f", X"aa", X"ff", X"e0", |
X"8f", X"a9", X"ff", X"e4", X"8f", X"a8", X"ff", X"e8", |
X"8f", X"bf", X"ff", X"ec", X"8f", X"bd", X"ff", X"f0", |
X"40", X"1b", X"70", X"00", X"40", X"1a", X"68", X"00", |
X"00", X"1a", X"d7", X"c2", X"33", X"5a", X"00", X"01", |
X"17", X"40", X"00", X"03", X"23", X"7b", X"00", X"04", |
X"03", X"60", X"00", X"08", X"00", X"00", X"00", X"00", |
X"23", X"7b", X"00", X"04", X"03", X"60", X"00", X"08", |
X"42", X"00", X"00", X"10", X"33", X"5b", X"00", X"3f", |
X"3b", X"68", X"00", X"20", X"11", X"00", X"00", X"14", |
X"3b", X"68", X"00", X"21", X"11", X"00", X"00", X"1c", |
X"00", X"00", X"00", X"00", X"3c", X"08", X"20", X"01", |
X"ad", X"1a", X"04", X"00", X"0b", X"f0", X"00", X"b7", |
X"00", X"00", X"00", X"00", X"33", X"5b", X"00", X"3f", |
X"3b", X"68", X"00", X"00", X"11", X"00", X"00", X"1e", |
X"3b", X"68", X"00", X"04", X"11", X"00", X"00", X"29", |
X"00", X"00", X"00", X"00", X"3c", X"08", X"20", X"01", |
X"ad", X"1a", X"04", X"00", X"0b", X"f0", X"00", X"b7", |
X"00", X"00", X"00", X"00", X"8d", X"1a", X"00", X"04", |
X"03", X"e0", X"00", X"08", X"00", X"00", X"00", X"00", |
X"0f", X"f0", X"01", X"61", X"3c", X"0a", X"80", X"00", |
X"00", X"00", X"40", X"21", X"03", X"6a", X"48", X"24", |
X"15", X"20", X"00", X"03", X"00", X"0a", X"50", X"42", |
X"15", X"40", X"ff", X"fc", X"25", X"08", X"00", X"01", |
X"0b", X"f0", X"01", X"17", X"01", X"00", X"d8", X"21", |
X"0f", X"f0", X"01", X"61", X"3c", X"0a", X"80", X"00", |
X"00", X"00", X"40", X"21", X"03", X"6a", X"48", X"24", |
X"11", X"20", X"00", X"03", X"00", X"0a", X"50", X"42", |
X"15", X"40", X"ff", X"fc", X"25", X"08", X"00", X"01", |
X"0b", X"f0", X"01", X"17", X"01", X"00", X"d8", X"21", |
X"0f", X"f0", X"01", X"61", X"00", X"00", X"00", X"00", |
X"00", X"1a", X"41", X"82", X"31", X"08", X"00", X"1f", |
X"00", X"1a", X"4a", X"c2", X"31", X"29", X"00", X"1f", |
X"01", X"09", X"50", X"21", X"00", X"0a", X"50", X"23", |
X"25", X"4a", X"00", X"1f", X"01", X"5b", X"d8", X"04", |
X"01", X"5b", X"d8", X"06", X"0b", X"f0", X"01", X"17", |
X"01", X"1b", X"d8", X"06", X"0f", X"f0", X"01", X"61", |
X"00", X"00", X"00", X"00", X"00", X"1a", X"41", X"82", |
X"31", X"08", X"00", X"1f", X"00", X"1a", X"4a", X"c2", |
X"31", X"29", X"00", X"1f", X"01", X"28", X"48", X"23", |
X"00", X"09", X"58", X"23", X"25", X"6b", X"00", X"1f", |
X"01", X"1b", X"48", X"04", X"3c", X"0a", X"ff", X"ff", |
X"35", X"4a", X"ff", X"ff", X"01", X"6a", X"50", X"04", |
X"01", X"6a", X"50", X"06", X"01", X"0a", X"50", X"04", |
X"01", X"2a", X"48", X"24", X"01", X"40", X"50", X"27", |
X"0f", X"f0", X"01", X"61", X"00", X"1a", X"d1", X"40", |
X"00", X"1a", X"d1", X"42", X"03", X"6a", X"d8", X"24", |
X"03", X"69", X"d8", X"25", X"0b", X"f0", X"01", X"17", |
X"00", X"00", X"00", X"00", X"00", X"1a", X"4c", X"02", |
X"31", X"29", X"00", X"1f", X"3c", X"08", X"bf", X"c0", |
X"25", X"08", X"04", X"84", X"00", X"09", X"48", X"c0", |
X"01", X"09", X"40", X"20", X"01", X"00", X"00", X"08", |
X"00", X"00", X"00", X"00", X"0b", X"f0", X"00", X"b7", |
X"00", X"00", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"60", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"61", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"62", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"63", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"64", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"65", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"66", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"67", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"af", X"bb", X"ff", X"e8", X"0b", X"f0", X"01", X"1f", |
X"af", X"bb", X"ff", X"e4", X"0b", X"f0", X"01", X"1f", |
X"af", X"bb", X"ff", X"e0", X"0b", X"f0", X"01", X"1f", |
X"37", X"6b", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"6c", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"6d", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"6e", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"6f", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"70", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"71", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"72", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"73", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"74", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"75", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"76", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"77", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"78", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"79", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"7a", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"7b", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"37", X"7c", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"af", X"bb", X"ff", X"ec", X"0b", X"f0", X"01", X"1f", |
X"37", X"7e", X"00", X"00", X"0b", X"f0", X"01", X"1f", |
X"af", X"bb", X"ff", X"f0", X"af", X"bf", X"00", X"00", |
X"00", X"1a", X"dd", X"42", X"33", X"7b", X"00", X"1f", |
X"3c", X"08", X"bf", X"c0", X"25", X"08", X"05", X"b4", |
X"00", X"1b", X"d8", X"c0", X"01", X"1b", X"40", X"20", |
X"01", X"00", X"f8", X"09", X"00", X"00", X"00", X"00", |
X"8f", X"bf", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"00", X"00", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"34", X"1b", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"34", X"3b", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"34", X"5b", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"34", X"7b", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"34", X"9b", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"34", X"bb", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"34", X"db", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"34", X"fb", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"8f", X"bb", X"ff", X"e8", X"03", X"e0", X"00", X"08", |
X"8f", X"bb", X"ff", X"e4", X"03", X"e0", X"00", X"08", |
X"8f", X"bb", X"ff", X"e0", X"03", X"e0", X"00", X"08", |
X"35", X"7b", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"35", X"9b", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"35", X"bb", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"35", X"db", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"35", X"fb", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"36", X"1b", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"36", X"3b", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"36", X"5b", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"36", X"7b", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"36", X"9b", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"36", X"bb", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"36", X"db", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"36", X"fb", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"37", X"1b", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"37", X"3b", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"37", X"5b", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"37", X"7b", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"37", X"9a", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"8f", X"bb", X"ff", X"f0", X"03", X"e0", X"00", X"08", |
X"37", X"db", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"8f", X"bb", X"ff", X"ec", X"3c", X"1c", X"00", X"00", |
X"27", X"9c", X"7f", X"f0", X"3c", X"05", X"00", X"00", |
X"24", X"a5", X"00", X"00", X"3c", X"04", X"00", X"00", |
X"24", X"84", X"00", X"00", X"3c", X"1d", X"00", X"00", |
X"27", X"bd", X"04", X"28", X"ac", X"a0", X"00", X"00", |
X"00", X"a4", X"18", X"2a", X"14", X"60", X"ff", X"fd", |
X"24", X"a5", X"00", X"04", X"3c", X"04", X"00", X"00", |
X"24", X"84", X"00", X"00", X"3c", X"05", X"bf", X"c0", |
X"24", X"a5", X"0e", X"60", X"10", X"a4", X"00", X"0b", |
X"00", X"00", X"00", X"00", X"3c", X"10", X"00", X"00", |
X"26", X"10", X"00", X"00", X"12", X"00", X"00", X"07", |
X"00", X"00", X"00", X"00", X"8c", X"a8", X"00", X"00", |
X"24", X"a5", X"00", X"04", X"ac", X"88", X"00", X"00", |
X"24", X"84", X"00", X"04", X"16", X"00", X"ff", X"fb", |
X"26", X"10", X"ff", X"fc", X"0f", X"f0", X"01", X"cd", |
X"00", X"00", X"00", X"00", X"0b", X"f0", X"01", X"cb", |
X"00", X"00", X"00", X"00", X"3c", X"04", X"bf", X"c0", |
X"27", X"bd", X"ff", X"e8", X"af", X"bf", X"00", X"14", |
X"0f", X"f0", X"03", X"40", X"24", X"84", X"0e", X"04", |
X"3c", X"04", X"bf", X"c0", X"0f", X"f0", X"03", X"40", |
X"24", X"84", X"0e", X"2c", X"3c", X"04", X"bf", X"c0", |
X"8f", X"bf", X"00", X"14", X"24", X"84", X"0e", X"44", |
X"0b", X"f0", X"03", X"40", X"27", X"bd", X"00", X"18", |
X"10", X"80", X"00", X"09", X"00", X"00", X"00", X"00", |
X"8c", X"82", X"00", X"00", X"00", X"00", X"00", X"00", |
X"a0", X"45", X"00", X"00", X"8c", X"82", X"00", X"00", |
X"00", X"00", X"00", X"00", X"24", X"42", X"00", X"01", |
X"03", X"e0", X"00", X"08", X"ac", X"82", X"00", X"00", |
X"0b", X"f0", X"03", X"6e", X"00", X"a0", X"20", X"21", |
X"27", X"bd", X"ff", X"d8", X"af", X"b2", X"00", X"18", |
X"af", X"b1", X"00", X"14", X"af", X"b0", X"00", X"10", |
X"af", X"bf", X"00", X"24", X"af", X"b4", X"00", X"20", |
X"af", X"b3", X"00", X"1c", X"00", X"c0", X"90", X"21", |
X"00", X"80", X"88", X"21", X"18", X"c0", X"00", X"32", |
X"00", X"a0", X"80", X"21", X"90", X"a2", X"00", X"00", |
X"00", X"00", X"00", X"00", X"10", X"40", X"00", X"3d", |
X"00", X"a0", X"10", X"21", X"00", X"00", X"18", X"21", |
X"24", X"42", X"00", X"01", X"90", X"44", X"00", X"00", |
X"00", X"00", X"00", X"00", X"14", X"80", X"ff", X"fc", |
X"24", X"63", X"00", X"01", X"00", X"72", X"10", X"2a", |
X"14", X"40", X"00", X"02", X"02", X"43", X"90", X"23", |
X"00", X"00", X"90", X"21", X"30", X"e2", X"00", X"02", |
X"10", X"40", X"00", X"22", X"30", X"e7", X"00", X"01", |
X"10", X"e0", X"00", X"22", X"24", X"14", X"00", X"30", |
X"00", X"00", X"98", X"21", X"92", X"05", X"00", X"00", |
X"00", X"00", X"00", X"00", X"10", X"a0", X"00", X"08", |
X"00", X"00", X"00", X"00", X"02", X"20", X"20", X"21", |
X"0f", X"f0", X"01", X"da", X"26", X"10", X"00", X"01", |
X"92", X"05", X"00", X"00", X"00", X"00", X"00", X"00", |
X"14", X"a0", X"ff", X"fa", X"26", X"73", X"00", X"01", |
X"1a", X"40", X"00", X"08", X"02", X"40", X"80", X"21", |
X"26", X"10", X"ff", X"ff", X"02", X"20", X"20", X"21", |
X"0f", X"f0", X"01", X"da", X"02", X"80", X"28", X"21", |
X"16", X"00", X"ff", X"fc", X"26", X"10", X"ff", X"ff", |
X"02", X"72", X"98", X"21", X"8f", X"bf", X"00", X"24", |
X"02", X"60", X"10", X"21", X"8f", X"b4", X"00", X"20", |
X"8f", X"b3", X"00", X"1c", X"8f", X"b2", X"00", X"18", |
X"8f", X"b1", X"00", X"14", X"8f", X"b0", X"00", X"10", |
X"03", X"e0", X"00", X"08", X"27", X"bd", X"00", X"28", |
X"30", X"e7", X"00", X"01", X"14", X"e0", X"ff", X"e0", |
X"24", X"14", X"00", X"20", X"1a", X"40", X"ff", X"de", |
X"02", X"40", X"98", X"21", X"26", X"73", X"ff", X"ff", |
X"02", X"20", X"20", X"21", X"0f", X"f0", X"01", X"da", |
X"02", X"80", X"28", X"21", X"16", X"60", X"ff", X"fc", |
X"26", X"73", X"ff", X"ff", X"26", X"73", X"00", X"01", |
X"02", X"40", X"98", X"21", X"0b", X"f0", X"02", X"05", |
X"00", X"00", X"90", X"21", X"00", X"00", X"18", X"21", |
X"0b", X"f0", X"01", X"ff", X"02", X"43", X"90", X"23", |
X"27", X"bd", X"ff", X"c8", X"af", X"b4", X"00", X"30", |
X"af", X"b2", X"00", X"28", X"af", X"b1", X"00", X"24", |
X"af", X"bf", X"00", X"34", X"af", X"b3", X"00", X"2c", |
X"af", X"b0", X"00", X"20", X"00", X"a0", X"10", X"21", |
X"8f", X"b4", X"00", X"48", X"8f", X"b2", X"00", X"4c", |
X"10", X"a0", X"00", X"3f", X"00", X"80", X"88", X"21", |
X"14", X"e0", X"00", X"31", X"24", X"03", X"00", X"0a", |
X"00", X"00", X"38", X"21", X"10", X"40", X"00", X"49", |
X"a3", X"a0", X"00", X"1b", X"8f", X"a5", X"00", X"50", |
X"27", X"b3", X"00", X"1b", X"24", X"a5", X"ff", X"c6", |
X"14", X"c0", X"00", X"02", X"00", X"46", X"00", X"1b", |
X"00", X"07", X"00", X"0d", X"00", X"00", X"18", X"10", |
X"28", X"64", X"00", X"0a", X"00", X"00", X"00", X"00", |
X"14", X"c0", X"00", X"02", X"00", X"46", X"00", X"1b", |
X"00", X"07", X"00", X"0d", X"00", X"00", X"10", X"12", |
X"14", X"80", X"00", X"02", X"26", X"73", X"ff", X"ff", |
X"00", X"65", X"18", X"21", X"24", X"63", X"00", X"30", |
X"14", X"40", X"ff", X"f1", X"a2", X"63", X"00", X"00", |
X"14", X"e0", X"00", X"10", X"00", X"00", X"00", X"00", |
X"00", X"00", X"80", X"21", X"02", X"20", X"20", X"21", |
X"02", X"60", X"28", X"21", X"02", X"80", X"30", X"21", |
X"0f", X"f0", X"01", X"e6", X"02", X"40", X"38", X"21", |
X"8f", X"bf", X"00", X"34", X"00", X"50", X"10", X"21", |
X"8f", X"b4", X"00", X"30", X"8f", X"b3", X"00", X"2c", |
X"8f", X"b2", X"00", X"28", X"8f", X"b1", X"00", X"24", |
X"8f", X"b0", X"00", X"20", X"03", X"e0", X"00", X"08", |
X"27", X"bd", X"00", X"38", X"12", X"80", X"00", X"0f", |
X"32", X"42", X"00", X"02", X"10", X"40", X"00", X"0d", |
X"02", X"20", X"20", X"21", X"0f", X"f0", X"01", X"da", |
X"24", X"05", X"00", X"2d", X"26", X"94", X"ff", X"ff", |
X"0b", X"f0", X"02", X"5b", X"24", X"10", X"00", X"01", |
X"14", X"c3", X"ff", X"d0", X"00", X"00", X"38", X"21", |
X"04", X"a1", X"ff", X"ce", X"00", X"00", X"00", X"00", |
X"00", X"05", X"10", X"23", X"0b", X"f0", X"02", X"43", |
X"24", X"07", X"00", X"01", X"26", X"73", X"ff", X"ff", |
X"24", X"02", X"00", X"2d", X"a2", X"62", X"00", X"00", |
X"0b", X"f0", X"02", X"5b", X"00", X"00", X"80", X"21", |
X"27", X"a5", X"00", X"10", X"02", X"80", X"30", X"21", |
X"02", X"40", X"38", X"21", X"24", X"02", X"00", X"30", |
X"a3", X"a2", X"00", X"10", X"0f", X"f0", X"01", X"e6", |
X"a3", X"a0", X"00", X"11", X"8f", X"bf", X"00", X"34", |
X"8f", X"b4", X"00", X"30", X"8f", X"b3", X"00", X"2c", |
X"8f", X"b2", X"00", X"28", X"8f", X"b1", X"00", X"24", |
X"8f", X"b0", X"00", X"20", X"03", X"e0", X"00", X"08", |
X"27", X"bd", X"00", X"38", X"10", X"e0", X"ff", X"cc", |
X"27", X"b3", X"00", X"1b", X"0b", X"f0", X"02", X"69", |
X"00", X"00", X"00", X"00", X"27", X"bd", X"ff", X"b8", |
X"af", X"b4", X"00", X"38", X"af", X"b0", X"00", X"28", |
X"af", X"bf", X"00", X"44", X"af", X"b6", X"00", X"40", |
X"af", X"b5", X"00", X"3c", X"af", X"b3", X"00", X"34", |
X"af", X"b2", X"00", X"30", X"af", X"b1", X"00", X"2c", |
X"00", X"a0", X"80", X"21", X"90", X"a5", X"00", X"00", |
X"00", X"80", X"a0", X"21", X"10", X"a0", X"00", X"a0", |
X"af", X"a6", X"00", X"50", X"00", X"00", X"90", X"21", |
X"24", X"13", X"00", X"25", X"24", X"15", X"00", X"2d", |
X"24", X"11", X"00", X"30", X"3c", X"16", X"bf", X"c0", |
X"14", X"b3", X"00", X"53", X"00", X"00", X"00", X"00", |
X"26", X"10", X"00", X"01", X"92", X"05", X"00", X"00", |
X"00", X"00", X"00", X"00", X"10", X"a0", X"00", X"3e", |
X"00", X"00", X"00", X"00", X"10", X"b3", X"00", X"4c", |
X"00", X"00", X"00", X"00", X"10", X"b5", X"00", X"54", |
X"00", X"00", X"00", X"00", X"00", X"00", X"18", X"21", |
X"14", X"b1", X"00", X"07", X"24", X"a2", X"ff", X"d0", |
X"26", X"10", X"00", X"01", X"92", X"05", X"00", X"00", |
X"00", X"00", X"00", X"00", X"10", X"b1", X"ff", X"fc", |
X"34", X"63", X"00", X"02", X"24", X"a2", X"ff", X"d0", |
X"30", X"42", X"00", X"ff", X"2c", X"42", X"00", X"0a", |
X"10", X"40", X"00", X"0d", X"00", X"00", X"10", X"21", |
X"00", X"02", X"20", X"40", X"00", X"02", X"10", X"c0", |
X"00", X"82", X"10", X"21", X"26", X"10", X"00", X"01", |
X"00", X"45", X"10", X"21", X"92", X"05", X"00", X"00", |
X"00", X"00", X"00", X"00", X"24", X"a4", X"ff", X"d0", |
X"30", X"84", X"00", X"ff", X"2c", X"84", X"00", X"0a", |
X"14", X"80", X"ff", X"f5", X"24", X"42", X"ff", X"d0", |
X"24", X"04", X"00", X"73", X"10", X"a4", X"00", X"3c", |
X"24", X"04", X"00", X"64", X"10", X"a4", X"00", X"46", |
X"02", X"80", X"20", X"21", X"24", X"04", X"00", X"78", |
X"10", X"a4", X"00", X"51", X"02", X"80", X"20", X"21", |
X"24", X"04", X"00", X"58", X"10", X"a4", X"00", X"55", |
X"02", X"80", X"20", X"21", X"24", X"04", X"00", X"75", |
X"10", X"a4", X"00", X"60", X"02", X"80", X"20", X"21", |
X"24", X"04", X"00", X"63", X"14", X"a4", X"00", X"24", |
X"26", X"10", X"00", X"01", X"8f", X"a9", X"00", X"50", |
X"27", X"a5", X"00", X"20", X"8d", X"28", X"00", X"00", |
X"02", X"80", X"20", X"21", X"25", X"29", X"00", X"04", |
X"00", X"40", X"30", X"21", X"00", X"60", X"38", X"21", |
X"af", X"a9", X"00", X"50", X"a3", X"a8", X"00", X"20", |
X"0f", X"f0", X"01", X"e6", X"a3", X"a0", X"00", X"21", |
X"92", X"05", X"00", X"00", X"00", X"00", X"00", X"00", |
X"14", X"a0", X"ff", X"bd", X"02", X"42", X"90", X"21", |
X"12", X"80", X"00", X"04", X"00", X"00", X"00", X"00", |
X"8e", X"82", X"00", X"00", X"00", X"00", X"00", X"00", |
X"a0", X"40", X"00", X"00", X"8f", X"bf", X"00", X"44", |
X"02", X"40", X"10", X"21", X"8f", X"b6", X"00", X"40", |
X"8f", X"b5", X"00", X"3c", X"8f", X"b4", X"00", X"38", |
X"8f", X"b3", X"00", X"34", X"8f", X"b2", X"00", X"30", |
X"8f", X"b1", X"00", X"2c", X"8f", X"b0", X"00", X"28", |
X"03", X"e0", X"00", X"08", X"27", X"bd", X"00", X"48", |
X"0f", X"f0", X"01", X"da", X"02", X"80", X"20", X"21", |
X"26", X"52", X"00", X"01", X"26", X"10", X"00", X"01", |
X"92", X"05", X"00", X"00", X"00", X"00", X"00", X"00", |
X"14", X"a0", X"ff", X"a5", X"00", X"00", X"00", X"00", |
X"0b", X"f0", X"02", X"e8", X"00", X"00", X"00", X"00", |
X"26", X"10", X"00", X"01", X"92", X"05", X"00", X"00", |
X"0b", X"f0", X"02", X"b0", X"24", X"03", X"00", X"01", |
X"8f", X"a4", X"00", X"50", X"00", X"00", X"00", X"00", |
X"8c", X"85", X"00", X"00", X"24", X"84", X"00", X"04", |
X"10", X"a0", X"00", X"31", X"af", X"a4", X"00", X"50", |
X"02", X"80", X"20", X"21", X"00", X"40", X"30", X"21", |
X"0f", X"f0", X"01", X"e6", X"00", X"60", X"38", X"21", |
X"0b", X"f0", X"02", X"fb", X"02", X"42", X"90", X"21", |
X"8f", X"a8", X"00", X"50", X"00", X"00", X"00", X"00", |
X"8d", X"05", X"00", X"00", X"24", X"06", X"00", X"0a", |
X"25", X"08", X"00", X"04", X"24", X"07", X"00", X"01", |
X"af", X"a2", X"00", X"10", X"24", X"02", X"00", X"61", |
X"af", X"a8", X"00", X"50", X"af", X"a3", X"00", X"14", |
X"0f", X"f0", X"02", X"34", X"af", X"a2", X"00", X"18", |
X"0b", X"f0", X"02", X"fb", X"02", X"42", X"90", X"21", |
X"8f", X"a8", X"00", X"50", X"00", X"00", X"00", X"00", |
X"8d", X"05", X"00", X"00", X"24", X"06", X"00", X"10", |
X"25", X"08", X"00", X"04", X"0b", X"f0", X"03", X"18", |
X"00", X"00", X"38", X"21", X"8f", X"a8", X"00", X"50", |
X"00", X"00", X"00", X"00", X"8d", X"05", X"00", X"00", |
X"24", X"06", X"00", X"10", X"25", X"08", X"00", X"04", |
X"af", X"a2", X"00", X"10", X"00", X"00", X"38", X"21", |
X"24", X"02", X"00", X"41", X"af", X"a8", X"00", X"50", |
X"af", X"a3", X"00", X"14", X"0f", X"f0", X"02", X"34", |
X"af", X"a2", X"00", X"18", X"0b", X"f0", X"02", X"fb", |
X"02", X"42", X"90", X"21", X"8f", X"a8", X"00", X"50", |
X"00", X"00", X"00", X"00", X"8d", X"05", X"00", X"00", |
X"24", X"06", X"00", X"0a", X"25", X"08", X"00", X"04", |
X"0b", X"f0", X"03", X"18", X"00", X"00", X"38", X"21", |
X"0b", X"f0", X"03", X"0c", X"26", X"c5", X"0e", X"58", |
X"0b", X"f0", X"02", X"e8", X"00", X"00", X"90", X"21", |
X"27", X"bd", X"ff", X"e0", X"27", X"a2", X"00", X"24", |
X"00", X"80", X"18", X"21", X"af", X"a5", X"00", X"24", |
X"af", X"a6", X"00", X"28", X"00", X"00", X"20", X"21", |
X"00", X"60", X"28", X"21", X"00", X"40", X"30", X"21", |
X"af", X"bf", X"00", X"1c", X"af", X"a7", X"00", X"2c", |
X"0f", X"f0", X"02", X"91", X"af", X"a2", X"00", X"10", |
X"8f", X"bf", X"00", X"1c", X"00", X"00", X"00", X"00", |
X"03", X"e0", X"00", X"08", X"27", X"bd", X"00", X"20", |
X"27", X"bd", X"ff", X"e0", X"27", X"a2", X"00", X"28", |
X"af", X"a4", X"00", X"20", X"af", X"a6", X"00", X"28", |
X"27", X"a4", X"00", X"20", X"00", X"40", X"30", X"21", |
X"af", X"bf", X"00", X"1c", X"af", X"a7", X"00", X"2c", |
X"0f", X"f0", X"02", X"91", X"af", X"a2", X"00", X"10", |
X"8f", X"bf", X"00", X"1c", X"00", X"00", X"00", X"00", |
X"03", X"e0", X"00", X"08", X"27", X"bd", X"00", X"20", |
X"27", X"bd", X"ff", X"e0", X"27", X"a2", X"00", X"2c", |
X"af", X"a4", X"00", X"20", X"00", X"c0", X"28", X"21", |
X"27", X"a4", X"00", X"20", X"00", X"40", X"30", X"21", |
X"af", X"bf", X"00", X"1c", X"af", X"a7", X"00", X"2c", |
X"0f", X"f0", X"02", X"91", X"af", X"a2", X"00", X"10", |
X"8f", X"bf", X"00", X"1c", X"00", X"00", X"00", X"00", |
X"03", X"e0", X"00", X"08", X"27", X"bd", X"00", X"20", |
X"03", X"e0", X"00", X"08", X"00", X"00", X"10", X"21", |
X"00", X"80", X"10", X"21", X"3c", X"05", X"20", X"00", |
X"8c", X"a3", X"00", X"04", X"00", X"00", X"00", X"00", |
X"30", X"63", X"00", X"02", X"10", X"60", X"ff", X"fc", |
X"3c", X"03", X"20", X"00", X"ac", X"62", X"00", X"00", |
X"03", X"e0", X"00", X"08", X"00", X"00", X"00", X"00", |
X"3c", X"03", X"20", X"00", X"8c", X"62", X"00", X"04", |
X"00", X"00", X"00", X"00", X"30", X"42", X"00", X"01", |
X"10", X"40", X"ff", X"fc", X"3c", X"02", X"20", X"00", |
X"8c", X"42", X"00", X"00", X"03", X"e0", X"00", X"08", |
X"00", X"02", X"16", X"02", X"63", X"6f", X"6d", X"70", |
X"69", X"6c", X"65", X"20", X"74", X"69", X"6d", X"65", |
X"3a", X"20", X"4a", X"75", X"6e", X"20", X"20", X"39", |
X"20", X"32", X"30", X"31", X"32", X"20", X"2d", X"2d", |
X"20", X"31", X"36", X"3a", X"33", X"38", X"3a", X"30", |
X"32", X"0a", X"00", X"00", X"67", X"63", X"63", X"20", |
X"76", X"65", X"72", X"73", X"69", X"6f", X"6e", X"3a", |
X"20", X"20", X"34", X"2e", X"35", X"2e", X"32", X"0a", |
X"00", X"00", X"00", X"00", X"0a", X"0a", X"48", X"65", |
X"6c", X"6c", X"6f", X"20", X"57", X"6f", X"72", X"6c", |
X"64", X"21", X"0a", X"0a", X"0a", X"00", X"00", X"00", |
X"28", X"6e", X"75", X"6c", X"6c", X"29", X"00" |
); |
|
|
end package obj_code_pkg; |
/vhdl/SoC/uart.vhdl
0,0 → 1,569
--############################################################################## |
-- uart.vhdl -- Basic, hardwired RS232 UART. |
-- |
-- Most operational parameters are hardcoded: 8 bit words, no parity, 1 stop |
-- bit. The only parameter that can be configured in run time is the baud rate. |
-- |
-- The receiver logic is a simplified copy of the 8051 UART. The bit period is |
-- split in 16 sampling periods, and 3 samples are taken at the center of each |
-- bit period. The bit value is decided by majority. The receiver logic has some |
-- error recovery capability that should make this core reliable enough for |
-- actual application use -- yet, the core does not have a format test bench. |
-- |
-- See usage notes below. |
-- |
-------------------------------------------------------------------------------- |
-- This file is free software (See COPYING.TXT) |
--############################################################################## |
|
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.numeric_std.all; |
|
-------------------------------------------------------------------------------- |
-- UART programmer model |
-------------------------------------------------------------------------------- |
-- |
-- The UART has a number of configuration registers addressable with input |
-- signal addr_*_i: |
-- |
-- [00] => Data buffer, both transmission and reception. |
-- [01] => Status/control register (r/w). |
-- [10] => Bit period register, low byte. |
-- [11] => Bit period register, high byte. |
-- |
-- |
-- Data buffers: |
---------------- |
-- |
-- The same address [00b] is used for both the receive buffer and the |
-- transmision buffer. |
-- |
-- Writing to the data buffer when flag TxRdy is high will trigger a |
-- transmission and clear flag TxRdy. |
-- Writing to the data buffer when flag TxRdy is clear will have no effect. |
-- |
-- Reading the data register when flag RxRdy is high will return the last |
-- received data byte, and will clear flag RxRdy but NOT RxIrq. |
-- Reading the register when flag RxRdy is clear will return indeterminate data, |
-- which in practice will usually be the last byte received. |
-- |
-- Interrupts: |
-------------- |
-- |
-- The core has two interrupt sources tied to a single external irq line. The |
-- sources are these: |
-- |
-- -# Receiver interrupt: Raised when the stop bit is sampled and determined |
-- to be valid (about the middle of the bit period). |
-- If the stop bit is not valid (not high) then the interrupt is not |
-- triggered. If a start bit is determined to be spurious (i.e. the falling |
-- edge is detected but the bit value when sampled is not 0) then the |
-- interrupt is not triggered. |
-- This interrupt sets flag RxIrw in the status register. |
-- -# Transmitter interrupt: Raised at the end of the transmission of the stop |
-- bit. |
-- This interrupt sets flag TxIrq in the status register 1 clock cycle after |
-- the interrupt is raised. |
-- |
-- The core does not have any interrupt enable mask. If any interrupt source |
-- triggers, the output irq_o is asserted for one cycle. This is all the extent |
-- of the interrupt processing done by this module. |
-- |
-- Error detection: |
------------------- |
-- |
-- The core is capable of detecting and recovering from these error conditions: |
-- |
-- -# When a start bit is determined to be spurious (i.e. the falling edge is |
-- detected but the bit value when sampled is not 0) then the core returns to |
-- its idle state (waiting for a new start bit). |
-- -# If a stop bit is determined to be invalid (not 1 when sampled), the |
-- reception interrupt is not triggered and the received byte is discarded. |
-- -# When the 3 samples taken from the center of a bit period are not equal, |
-- the bit value is decided by majority. |
-- |
-- In none of the 3 cases does the core raise any error flag. It would be very |
-- easy to include those flags in the core, but it would take a lot more time |
-- to test them minimally and that's why they haven't been included. |
-- |
-- Status register flags: |
------------------------- |
-- |
-- 7 6 5 4 3 2 1 0 |
-- +-------+-------+-------+-------+-------+-------+-------+-------+ |
-- | 0 | 0 | RxIrq | TxIrq | 0 | 0 | RxRdy | TxRdy | |
-- +-------+-------+-------+-------+-------+-------+-------+-------+ |
-- h h W1C W1C h h r r |
-- |
-- Bits marked 'h' are hardwired and can't be modified. |
-- Bits marked 'r' are read only; they are set and clear by the UART core. |
-- Bits marked W1C ('Write 1 Clear') are set by the UART core when an interrupt |
-- has been triggered and must be cleared by the software by writing a '1'. |
-- |
-- -# Status bit TxRdy is high when there isn't any transmission in progress. |
-- It is cleared when data is written to the transmission buffer and is |
-- raised at the same time the transmission interrupt is triggered. |
-- -# Status bit RxRdy is raised at the same time the receive interrupt is |
-- triggered and is cleared when the data register is read. |
-- -# Status bit TxIrq is raised when the transmission interrupt is triggered |
-- and is cleared when a 1 is written to it. |
-- -# Status bit RxIrq is raised when the reception interrupt is triggered |
-- and is cleared when a 1 is written to it. |
-- |
-- When writing to the status/control registers, only flags TxIrq and RxIrq are |
-- affected, and only when writing a '1' as explained above. All other flags |
-- are read-only. |
-- |
-- Baud rate configuration: |
--------------------------- |
-- |
-- The baud rate is determined by the value of 14-bit register 'bit_period_reg'. |
-- This register holds the length of the bit period in clock cycles and its |
-- value may be hardcoded or configured at run time. |
-- |
-- When generic HARDWIRED is true, bit_period_reg is hardwired with a value |
-- computed from the value of generic BAUD_RATE. The bit period computation |
-- needs to know the master clock rate, which should be given in generic |
-- CLOCK_RATE. |
-- Writes to the baud registers when HARDWIRED is true will be ignored. |
-- |
-- When generic HARDWIRED is false, generics BAUD_RATE and CLOCK_RATE determine |
-- the reset value of bit_period_reg, but the register can be changed at run |
-- time by writing at addresses [10b] and [11b], which access the low and high |
-- bytes of the register, respectively. |
-- Reading from those register addresses returns the value of the status |
-- register (a LUT saving measure) so the registers are effectively write-only. |
-- |
-------------------------------------------------------------------------------- |
-- Core interface signals: |
-- |
-- clk_i: Clock input, active rising edge. |
-- reset_i: Synchronous reset. |
-- txd_o: TxD UART output. |
-- rxd_i: RxD UART input -- synchronization logic included. |
-- irq_o: Interrupt output, asserted for 1 cycle when triggered. |
-- data_i: Data bus, input. |
-- data_o: Data bus, output. |
-- addr_rd_i: Register selection address, read access (see above). |
-- addr_wr_i: Register selection address, write access (see above). |
-- wr_i: Write enable input. |
-- rd_i: Read enable input. |
-- ce_i: Chip enable, must be active at the same time as wr_i or rd_i. |
-- |
-- |
-- No detailed explanation of the i/f timing can be given for lack of time. |
-- The core reads and writes like a synchronous memory. |
-------------------------------------------------------------------------------- |
|
entity uart is |
generic ( |
HARDWIRED : boolean := true; -- Baud rate hardwired to constant value |
BAUD_RATE : integer := 19200; -- Default (or hardwired) baud rate |
CLOCK_FREQ : integer := 50E6); -- Clock rate |
port ( |
rxd_i : in std_logic; |
txd_o : out std_logic; |
|
irq_o : out std_logic; |
|
data_i : in std_logic_vector(7 downto 0); |
data_o : out std_logic_vector(7 downto 0); |
|
addr_rd_i : in std_logic_vector(1 downto 0); |
addr_wr_i : in std_logic_vector(1 downto 0); |
wr_i : in std_logic; |
rd_i : in std_logic; |
ce_i : in std_logic; |
|
clk_i : in std_logic; |
reset_i : in std_logic); |
end uart; |
|
architecture hardwired of uart is |
|
-- Bit period expressed in master clock cycles |
constant DEFAULT_BIT_PERIOD : integer := (CLOCK_FREQ / BAUD_RATE); |
|
-- Bit sampling period is 1/16 of the baud rate. |
constant DEFAULT_SAMPLING_PERIOD : integer := DEFAULT_BIT_PERIOD / 16; |
|
|
|
--############################################################################## |
|
-- Common signals |
|
signal reset : std_logic; |
signal clk : std_logic; |
|
|
signal bit_period_reg : unsigned(13 downto 0); |
signal sampling_period : unsigned(9 downto 0); |
|
|
-- Interrupt & status register signals |
|
signal tx_irq_flag : std_logic; |
signal rx_irq_flag : std_logic; |
signal load_stat_reg : std_logic; |
signal load_tx_reg : std_logic; |
|
-- Receiver signals |
signal rxd_q : std_logic; |
signal tick_ctr : unsigned(3 downto 0); |
signal state : unsigned(3 downto 0); |
signal next_state : unsigned(3 downto 0); |
signal start_bit_detected : std_logic; |
signal reset_tick_ctr : std_logic; |
signal stop_bit_sampled : std_logic; |
signal load_rx_buffer : std_logic; |
signal stop_error : std_logic; |
signal samples : std_logic_vector(2 downto 0); |
signal sampled_bit : std_logic; |
signal do_shift : std_logic; |
signal rx_buffer : std_logic_vector(7 downto 0); |
signal rx_shift_reg : std_logic_vector(9 downto 0); |
signal tick_ctr_enable : std_logic; |
signal tick_baud_ctr : unsigned(10 downto 0); |
|
signal rx_rdy_flag : std_logic; |
signal rx_irq : std_logic; |
signal set_rx_rdy_flag : std_logic; |
signal rxd : std_logic; |
|
signal read_rx : std_logic; |
signal status : std_logic_vector(7 downto 0); |
|
-- Transmitter signals |
|
signal tx_counter : unsigned(13 downto 0); |
signal tx_data : std_logic_vector(10 downto 0); |
signal tx_ctr_bit : unsigned(3 downto 0); |
signal tx_busy : std_logic; |
signal tx_irq : std_logic; |
|
|
|
begin |
|
-- Rename the most commonly used inputs to get rid of the i/o suffix |
clk <= clk_i; |
reset <= reset_i; |
rxd <= rxd_i; |
|
|
-- Serial port status byte -- only 2 status flags |
status <= |
"00" & rx_irq_flag & tx_irq_flag & -- Interrupt flags |
"00" & rx_rdy_flag & (not tx_busy); -- State flags |
|
-- Read register multiplexor |
with addr_rd_i select data_o <= |
rx_buffer when "00", |
status when others; |
|
|
load_tx_reg <= '1' when wr_i = '1' and ce_i = '1' and addr_wr_i = "00" else '0'; |
load_stat_reg <= '1' when wr_i = '1' and ce_i = '1' and addr_wr_i = "01" else '0'; |
read_rx <= '1' when rd_i = '1' and ce_i = '1' else '0'; |
|
rx_irq <= set_rx_rdy_flag; |
|
irq_o <= rx_irq or tx_irq; |
|
interrupt_flags: |
process(clk) |
begin |
if clk'event and clk='1' then |
if reset = '1' then |
rx_irq_flag <= '0'; |
tx_irq_flag <= '0'; |
else |
if set_rx_rdy_flag='1' then |
rx_irq_flag <= '1'; |
elsif load_stat_reg='1' and data_i(5)='1' then |
rx_irq_flag <= '0'; |
end if; |
if tx_irq='1' then |
tx_irq_flag <= '1'; |
elsif load_stat_reg='1' and data_i(4)='1' then |
tx_irq_flag <= '0'; |
end if; |
end if; |
end if; |
end process interrupt_flags; |
|
|
baud_rate_registers: |
process(clk) |
begin |
if clk'event and clk='1' then |
if reset = '1' then |
bit_period_reg <= to_unsigned(DEFAULT_BIT_PERIOD,14); |
else |
if wr_i = '1' and ce_i = '1' then |
if addr_wr_i = "10" then |
bit_period_reg(7 downto 0) <= unsigned(data_i); |
elsif addr_wr_i = "11" then |
bit_period_reg(13 downto 8) <= unsigned(data_i(5 downto 0)); |
end if; |
end if; |
end if; |
end if; |
end process baud_rate_registers; |
|
sampling_period <= bit_period_reg(13 downto 4); |
|
|
-- Receiver -------------------------------------------------------------------- |
|
baud_counter: |
process(clk) |
begin |
if clk'event and clk='1' then |
if reset='1' then |
tick_baud_ctr <= (others => '0'); |
else |
if tick_baud_ctr=sampling_period then |
tick_baud_ctr <= (others => '0'); |
else |
tick_baud_ctr <= tick_baud_ctr + 1; |
end if; |
end if; |
end if; |
end process baud_counter; |
|
tick_ctr_enable<= '1' when tick_baud_ctr=sampling_period else '0'; |
|
-- Register RxD at the bit sampling rate -- 16 times the baud rate. |
rxd_input_register: |
process(clk) |
begin |
if clk'event and clk='1' then |
if reset='1' then |
rxd_q <= '0'; |
else |
if tick_ctr_enable='1' then |
rxd_q <= rxd; |
end if; |
end if; |
end if; |
end process rxd_input_register; |
|
-- We detect the start bit when... |
start_bit_detected <= '1' when |
state="0000" and -- ...we're waiting for the start bit... |
rxd_q='1' and rxd='0' -- ...and we see RxD going 1-to-0 |
else '0'; |
|
-- As soon as we detect the start bit we synchronize the bit sampler to |
-- the start bit's falling edge. |
reset_tick_ctr <= '1' when start_bit_detected='1' else '0'; |
|
-- We have seen the end of the stop bit when... |
stop_bit_sampled <= '1' when |
state="1010" and -- ...we're in the stop bit period... |
tick_ctr="1011" -- ...and we get the 11th sample in the bit period |
else '0'; |
|
-- Load the RX buffer with the shift register when... |
load_rx_buffer <= '1' when |
stop_bit_sampled='1' and -- ...we've just seen the end of the stop bit... |
sampled_bit='1' -- ...and its value is correct (1) |
else '0'; |
|
-- Conversely, we detect a stop bit error when... |
stop_error <= '1' when |
stop_bit_sampled='1' and -- ...we've just seen the end of the stop bit... |
sampled_bit='0' -- ...and its value is incorrect (0) |
else '0'; |
|
-- tick_ctr is a counter 16 times faster than the baud rate that is aligned to |
-- the falling edge of the start bit, so that when tick_ctr=0 we're close to |
-- the start of a bit period. |
bit_sample_counter: |
process(clk) |
begin |
if clk'event and clk='1' then |
if reset='1' then |
tick_ctr <= "0000"; |
else |
if tick_ctr_enable='1' then |
-- Restart counter when it reaches 15 OR when the falling edge |
-- of the start bit is detected; this is how we synchronize to the |
-- start bit. |
if tick_ctr="1111" or reset_tick_ctr='1' then |
tick_ctr <= "0000"; |
else |
tick_ctr <= tick_ctr + 1; |
end if; |
end if; |
end if; |
end if; |
end process bit_sample_counter; |
|
-- Main RX state machine: |
-- 0 -> waiting for start bit |
-- 1 -> sampling start bit |
-- 2..9 -> sampling data bit 0 to 7 |
-- 10 -> sampling stop bit |
next_state <= |
-- Start sampling the start bit when we detect the falling edge |
"0001" when state="0000" and start_bit_detected='1' else |
-- Return to idle state if the start bit is not a clean 0 |
"0000" when state="0001" and tick_ctr="1010" and sampled_bit='1' else |
-- Return to idle state at the end of the stop bit period |
"0000" when state="1010" and tick_ctr="1111" else |
-- Otherwise, proceed to next bit period at the end of each period |
state + 1 when tick_ctr="1111" and do_shift='1' else |
state; |
|
rx_state_machine_register: |
process(clk) |
begin |
if clk'event and clk='1' then |
if reset='1' then |
state <= "0000"; |
else |
if tick_ctr_enable='1' then |
state <= next_state; |
end if; |
end if; |
end if; |
end process rx_state_machine_register; |
|
-- Collect 3 RxD samples from the 3 central sampling periods of the bit period. |
rx_sampler: |
process(clk) |
begin |
if clk'event and clk='1' then |
if reset='1' then |
samples <= "000"; |
else |
if tick_ctr_enable='1' then |
if tick_ctr="0111" then |
samples(0) <= rxd; |
end if; |
if tick_ctr="1000" then |
samples(1) <= rxd; |
end if; |
if tick_ctr="1001" then |
samples(2) <= rxd; |
end if; |
end if; |
end if; |
end if; |
end process rx_sampler; |
|
-- Decide the value of the RxD bit by majority |
with samples select |
sampled_bit <= '0' when "000", |
'0' when "001", |
'0' when "010", |
'1' when "011", |
'0' when "100", |
'1' when "101", |
'1' when "110", |
'1' when others; |
|
rx_buffer_register: |
process(clk) |
begin |
if clk'event and clk='1' then |
if reset='1' then |
rx_buffer <= "00000000"; |
set_rx_rdy_flag <= '0'; |
else |
if tick_ctr_enable='1' and load_rx_buffer='1' and rx_rdy_flag='0' then |
rx_buffer <= rx_shift_reg(8 downto 1); |
set_rx_rdy_flag <= '1'; |
else |
set_rx_rdy_flag <= '0'; |
end if; |
end if; |
end if; |
end process rx_buffer_register; |
|
rx_flag: |
process(clk) |
begin |
if clk'event and clk='1' then |
if reset='1' then |
rx_rdy_flag <= '0'; |
else |
if set_rx_rdy_flag='1' then |
rx_rdy_flag <= '1'; |
else |
if read_rx = '1' then |
rx_rdy_flag <= '0'; |
end if; |
end if; |
end if; |
end if; |
end process rx_flag; |
|
-- RX shifter control: shift in any state other than idle state (0) |
do_shift <= state(0) or state(1) or state(2) or state(3); |
|
rx_shift_register: |
process(clk) |
begin |
if clk'event and clk='1' then |
if reset='1' then |
rx_shift_reg <= "1111111111"; |
else |
if tick_ctr_enable='1' then |
if tick_ctr="1010" and do_shift='1' then |
rx_shift_reg(9) <= sampled_bit; |
rx_shift_reg(8 downto 0) <= rx_shift_reg(9 downto 1); |
end if; |
end if; |
end if; |
end if; |
end process rx_shift_register; |
|
|
-- Transmitter ----------------------------------------------------------------- |
|
|
main_tx_process: |
process(clk) |
begin |
if clk'event and clk='1' then |
|
if reset='1' then |
tx_data <= "10111111111"; |
tx_busy <= '0'; |
tx_irq <= '0'; |
tx_ctr_bit <= "0000"; |
tx_counter <= (others => '0'); |
elsif load_tx_reg='1' and tx_busy='0' then |
tx_data <= "1"&data_i&"01"; |
tx_busy <= '1'; |
else |
if tx_busy='1' then |
if tx_counter = bit_period_reg then |
tx_counter <= (others => '0'); |
tx_data(9 downto 0) <= tx_data(10 downto 1); |
tx_data(10) <= '1'; |
if tx_ctr_bit = "1010" then |
tx_busy <= '0'; |
tx_irq <= '1'; |
tx_ctr_bit <= "0000"; |
else |
tx_ctr_bit <= tx_ctr_bit + 1; |
end if; |
else |
tx_counter <= tx_counter + 1; |
end if; |
else |
tx_irq <= '0'; |
end if; |
end if; |
end if; |
end process main_tx_process; |
|
txd_o <= tx_data(0); |
|
end hardwired; |
/vhdl/SoC/mips_soc.vhdl
0,0 → 1,293
-------------------------------------------------------------------------------- |
-- Synthesizable ION SoC -- CPU + cache + bootstrap ROM (BRAM) + UART |
-------------------------------------------------------------------------------- |
-- |
-- |
-- |
-------------------------------------------------------------------------------- |
-- Generics |
------------ |
-- |
-- |
-- |
-------------------------------------------------------------------------------- |
-- Memory map |
-------------- |
-- |
-------------------------------------------------------------------------------- |
-- Copyright (C) 2012 Jose A. Ruiz |
-- |
-- This source file may be used and distributed without |
-- restriction provided that this copyright statement is not |
-- removed from the file and that any derivative work contains |
-- the original copyright notice and the associated disclaimer. |
-- |
-- This source file is free software; you can redistribute it |
-- and/or modify it under the terms of the GNU Lesser General |
-- Public License as published by the Free Software Foundation; |
-- either version 2.1 of the License, or (at your option) any |
-- later version. |
-- |
-- This source is distributed in the hope that it will be |
-- useful, but WITHOUT ANY WARRANTY; without even the implied |
-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR |
-- PURPOSE. See the GNU Lesser General Public License for more |
-- details. |
-- |
-- You should have received a copy of the GNU Lesser General |
-- Public License along with this source; if not, download it |
-- from http://www.opencores.org/lgpl.shtml |
-------------------------------------------------------------------------------- |
|
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.std_logic_arith.all; |
use ieee.std_logic_unsigned.all; |
use work.mips_pkg.all; |
|
entity mips_soc is |
generic ( |
CLOCK_FREQ : integer := 50000000; |
BAUD_RATE : integer := 19200; |
BOOT_BRAM_SIZE : integer := 1024; |
OBJ_CODE : t_obj_code := default_object_code; |
SRAM_ADDR_SIZE : integer := 17 -- < 10 to disable SRAM I/F |
); |
port( |
clk : in std_logic; |
reset : in std_logic; |
interrupt : in std_logic_vector(7 downto 0); |
|
-- interface to FPGA i/o devices |
io_rd_data : in std_logic_vector(31 downto 0); |
io_rd_addr : out std_logic_vector(31 downto 2); |
io_wr_addr : out std_logic_vector(31 downto 2); |
io_wr_data : out std_logic_vector(31 downto 0); |
io_rd_vma : out std_logic; |
io_byte_we : out std_logic_vector(3 downto 0); |
|
-- interface to asynchronous 16-bit-wide EXTERNAL SRAM |
sram_address : out std_logic_vector(SRAM_ADDR_SIZE downto 1); |
sram_data_wr : out std_logic_vector(15 downto 0); |
sram_data_rd : in std_logic_vector(15 downto 0); |
sram_byte_we_n : out std_logic_vector(1 downto 0); |
sram_oe_n : out std_logic; |
|
-- UART |
uart_rxd : in std_logic; |
uart_txd : out std_logic; |
|
-- Debug info register output |
debug_info : out t_debug_info |
); |
end; --entity mips_soc |
|
architecture rtl of mips_soc is |
|
-- Interface cpu-cache |
signal cpu_data_addr : t_word; |
signal cpu_data_rd_vma : std_logic; |
signal cpu_data_rd : t_word; |
signal cpu_code_rd_addr : t_pc; |
signal cpu_code_rd : t_word; |
signal cpu_code_rd_vma : std_logic; |
signal cpu_data_wr : t_word; |
signal cpu_byte_we : std_logic_vector(3 downto 0); |
signal cpu_mem_wait : std_logic; |
signal cpu_ic_invalidate : std_logic; |
signal cpu_cache_enable : std_logic; |
signal unmapped_access : std_logic; |
|
-- Interface to i/o |
signal mpu_io_rd_data : std_logic_vector(31 downto 0); |
signal mpu_io_wr_data : std_logic_vector(31 downto 0); |
signal mpu_io_rd_addr : std_logic_vector(31 downto 2); |
signal mpu_io_wr_addr : std_logic_vector(31 downto 2); |
signal mpu_io_rd_vma : std_logic; |
signal mpu_io_byte_we : std_logic_vector(3 downto 0); |
|
-- Interface to UARTs |
signal uart_ce : std_logic; |
signal uart_irq : std_logic; |
signal uart_rd_byte : std_logic_vector(7 downto 0); |
|
-- Bootstrap code BRAM |
constant BOOT_BRAM_ADDR_SIZE : integer := log2(BOOT_BRAM_SIZE); |
subtype t_boot_bram_address is std_logic_vector(BOOT_BRAM_ADDR_SIZE-1 downto 0); |
-- Boot BRAM, initialized with constant object code table |
signal boot_bram : t_word_table(0 to BOOT_BRAM_SIZE-1) := |
objcode_to_wtable(OBJ_CODE, BOOT_BRAM_SIZE); |
|
-- NOTE: 'write' signals are a remnant from a previous version, to be removed |
signal bram_rd_addr : t_boot_bram_address; |
signal bram_wr_addr : t_boot_bram_address; |
signal bram_rd_data : t_word; |
signal bram_wr_data : t_word; |
signal bram_byte_we : std_logic_vector(3 downto 0); |
|
|
-------------------------------------------------------------------------------- |
begin |
|
cpu: entity work.mips_cpu |
port map ( |
interrupt => interrupt, |
|
data_addr => cpu_data_addr, |
data_rd_vma => cpu_data_rd_vma, |
data_rd => cpu_data_rd, |
|
code_rd_addr=> cpu_code_rd_addr, |
code_rd => cpu_code_rd, |
code_rd_vma => cpu_code_rd_vma, |
|
data_wr => cpu_data_wr, |
byte_we => cpu_byte_we, |
|
mem_wait => cpu_mem_wait, |
cache_enable=> cpu_cache_enable, |
ic_invalidate=>cpu_ic_invalidate, |
|
clk => clk, |
reset => reset |
); |
|
cache: entity work.mips_cache |
generic map ( |
BRAM_ADDR_SIZE => BOOT_BRAM_ADDR_SIZE, |
SRAM_ADDR_SIZE => SRAM_ADDR_SIZE |
) |
port map ( |
clk => clk, |
reset => reset, |
|
-- Interface to CPU core |
data_addr => cpu_data_addr, |
data_rd => cpu_data_rd, |
data_rd_vma => cpu_data_rd_vma, |
|
code_rd_addr => cpu_code_rd_addr, |
code_rd => cpu_code_rd, |
code_rd_vma => cpu_code_rd_vma, |
|
byte_we => cpu_byte_we, |
data_wr => cpu_data_wr, |
|
mem_wait => cpu_mem_wait, |
cache_enable => cpu_cache_enable, |
ic_invalidate => cpu_ic_invalidate, |
unmapped => unmapped_access, |
|
-- interface to FPGA i/o devices |
io_rd_data => mpu_io_rd_data, |
io_wr_data => mpu_io_wr_data, |
io_rd_addr => mpu_io_rd_addr, |
io_wr_addr => mpu_io_wr_addr, |
io_rd_vma => mpu_io_rd_vma, |
io_byte_we => mpu_io_byte_we, |
|
-- interface to synchronous 32-bit-wide FPGA BRAM |
bram_rd_data => bram_rd_data, |
bram_wr_data => bram_wr_data, |
bram_rd_addr => bram_rd_addr, |
bram_wr_addr => bram_wr_addr, |
bram_byte_we => bram_byte_we, |
|
-- interface to asynchronous 16-bit-wide external SRAM |
sram_address => sram_address, |
sram_data_rd => sram_data_rd, |
sram_data_wr => sram_data_wr, |
sram_byte_we_n => sram_byte_we_n, |
sram_oe_n => sram_oe_n |
); |
|
|
-------------------------------------------------------------------------------- |
-- BRAM interface -- read only |
|
fpga_ram_block: |
process(clk) |
begin |
if clk'event and clk='1' then |
bram_rd_data <= boot_bram(conv_integer(unsigned(bram_rd_addr))); |
end if; |
end process fpga_ram_block; |
|
|
-------------------------------------------------------------------------------- |
-- Debug stuff |
|
-- Register some debug signals. These are meant to be connected to LEDs on a |
-- dev board, or maybe to logic analyzer probes. They are not useful once |
-- the core is fully debugged. |
debug_info_register: |
process(clk) |
begin |
if clk'event and clk='1' then |
if reset='1' then |
debug_info.unmapped_access <= '0'; |
else |
if unmapped_access='1' then |
-- This flag will be asserted permanently after any kind of |
-- unmapped access (code, data read or data write). |
debug_info.unmapped_access <= '1'; |
end if; |
end if; |
-- This flag will be asserted as long as the cache is enabled |
debug_info.cache_enabled <= cpu_cache_enable; |
end if; |
end process debug_info_register; |
|
|
-------------------------------------------------------------------------------- |
-- UART -- 8-bit interface, connected to LOW byte of word (address *3h) |
|
uart : entity work.uart |
generic map ( |
BAUD_RATE => BAUD_RATE, |
CLOCK_FREQ => CLOCK_FREQ |
) |
port map ( |
clk_i => clk, |
reset_i => reset, |
|
irq_o => uart_irq, |
data_i => mpu_io_wr_data(7 downto 0), |
data_o => uart_rd_byte, |
addr_rd_i => mpu_io_rd_addr(3 downto 2), |
addr_wr_i => mpu_io_wr_addr(3 downto 2), |
|
ce_i => uart_ce, |
wr_i => mpu_io_byte_we(3), |
rd_i => mpu_io_rd_vma, |
|
rxd_i => uart_rxd, |
txd_o => uart_txd |
); |
|
-- UART chip enable |
uart_ce <= '1' |
when (mpu_io_rd_vma='1' or mpu_io_byte_we(3)='1') and |
mpu_io_rd_addr(31 downto 28)=X"2" and |
mpu_io_rd_addr(15 downto 12)=X"0" |
else '0'; |
|
|
-------------------------------------------------------------------------------- |
-- I/O port multiplexor |
|
|
-- IO Rd mux: either the UART data/status word od the IO coming from outside |
mpu_io_rd_data <= |
X"000000" & uart_rd_byte when uart_ce = '1' else |
io_rd_data; |
|
-- io_rd_data |
io_rd_addr <= mpu_io_rd_addr; |
io_wr_addr <= mpu_io_wr_addr; |
io_wr_data <= mpu_io_wr_data; |
io_rd_vma <= mpu_io_rd_vma; |
io_byte_we <= mpu_io_byte_we; |
|
|
end architecture rtl; |