Advertisement
madegoff

MIPS CPU, nicht fertig

Jan 11th, 2023 (edited)
301
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 7.89 KB | None | 0 0
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4.  
  5. library work;
  6. use work.proc_config.all;
  7.  
  8. entity mipsCpu is
  9.     generic(PROG_FILE_NAME : string;
  10.             DATA_FILE_NAME : string
  11.     );
  12.     port(clk : in std_logic;
  13.          rst : in std_logic;
  14.          
  15.          -- instruction insertion ports
  16.          testMode_debug : in std_logic;
  17.          testInstruction_debug : in std_logic_vector(31 downto 0);
  18.          
  19.          -- ram access ports
  20.          ramInsertMode_debug : in std_logic; -- wenn das Signal = 1 , werden alle drei unteren weitergegeben; wenn 0 - drei MUX (um zu entscheiden ob unsere oder debug Signale genutyt werden sollen)
  21.          ramWriteEn_debug : in std_logic;
  22.          ramWriteAddr_debug : in std_logic_vector(LOG2_NUM_RAM_ELEMENTS - 1 downto 0);
  23.          ramWriteData_debug : in std_logic_vector(RAM_ELEMENT_WIDTH - 1 downto 0);
  24.          ramElements_debug : out ram_elements_type;
  25.          
  26.          -- register file access port
  27.          registers_debug : out reg_vector_type;
  28.          
  29.          -- intermediate result ports
  30.          pc_next_debug : out std_logic_vector(PC_WIDTH - 1 downto 0);
  31.          pc7SegDigits_debug : out pc_7seg_digits_type
  32.     );
  33. end mipsCpu;
  34.  
  35. architecture structural of mipsCpu is
  36.  
  37. --Signale Instruction Mux
  38. signal instruction_rom : std_logic_vector(31 downto 0);
  39. signal instruction : std_logic_vector(31 downto 0);
  40.  
  41. --Signale Instruction Memory
  42. signal addr_pc : std_logic_vector(31 downto 0);
  43.  
  44. --Signale Control
  45. signal regDst : std_logic;
  46. signal branch : std_logic;
  47. signal memRead : std_logic;
  48. signal memToReg : std_logic;
  49. signal aluOp : std_logic_vector(1 downto 0);
  50. signal memWrite : std_logic;
  51. signal aluSrc : std_logic;
  52. signal regWrite : std_logic; --in bei RegisterFile
  53.  
  54. --Signale Registers (mittig)
  55. signal writeReg : std_logic_vector(4 downto 0);
  56. signal writeData : std_logic_vector(31 downto 0);
  57.  
  58. signal readData1 : std_logic_vector(31 downto 0);
  59. signal readData2 : std_logic_vector(31 downto 0);
  60.  
  61. --Signale RAM
  62. signal ramWriteEn : std_logic;
  63. signal ramWriteAddr : std_logic_vector(31 downto 0);
  64. signal ramWriteData : std_logic_vector(31 downto 0);
  65.  
  66. --Signale Sign Extend
  67. signal signExtendNumber : std_logic_vector(31 downto 0);
  68.  
  69. --Signale Shift Left 2
  70. signal shiftedNumber : std_logic_vector(31 downto 0);
  71.  
  72. --Signale ALU Control
  73. signal operation : std_logic_vector(3 downto 0);
  74.  
  75. --Signale ALU
  76. signal aluResult : std_logic_vector(4 downto 0);
  77.  
  78. --zusaetzliche Signale
  79. signal muxalu : std_logic_vector(3 downto 0); -- auch der 4. MUX
  80. signal mux3 : std_logic_vector();
  81. signal muxRamOut : std_logic_vector(); -- auch der 2. Mux
  82. signal muxRamIn : std_logic_vector();
  83.  
  84. signal or_out : std_logic;
  85.  
  86.  
  87. --Signale Addierer
  88. signal add2 : std_logic_vector(31 downto 0);
  89. signal add1: std_logic_vector(31 downto 0);
  90.  
  91.  
  92. begin
  93.  
  94.  
  95.     with testMode_debug select
  96.         instruction <= testInstruction_debug when "1" else instruction_rom;
  97.  
  98.     -- Beschreibung der MIPS-CPU ergänzen
  99.    
  100.    
  101.     CONTROL: entity work.mipsCtrl(structural) --Beschreibung des Control MIPS
  102.         port map( op(5 downto 0) => testInstruction_debug(31 downto 26),
  103.             regDst => regDst,
  104.             branch => branch,
  105.             memRead => memRead,
  106.             aluOp(1 downto 0) => aluOp(1 downto 0),
  107.             memWrite => memWrite,
  108.             aluSrc => aluSrc,
  109.             regWrite => regWrite);
  110.            
  111.     or_out <= branch or zero;
  112.    
  113.    
  114.     --ramInsertMode_debug : in std_logic; -- wenn das Signal = 1 , werden alle drei unteren weitergegeben; wenn 0 - drei MUX (um zuentscheiden ob unsere oder debug Signale genutyt werden sollen)
  115.     --ramWriteEn_debug : in std_logic;
  116.     --ramWriteAddr_debug : in std_logic_vector(LOG2_NUM_RAM_ELEMENTS - 1 downto 0);
  117.     --ramWriteData_debug : in std_logic_vector(RAM_ELEMENT_WIDTH - 1 downto 0);
  118.    
  119.     with ramInsertMode_debug select -- Beschreibung des MUX vor dem RAM (Kommentar oben)
  120.         ramWriteEn <= ramWriteEn_debug when '1',
  121.                   memWrite when '0';
  122.     with ramInsertMode_debug select
  123.         ramWriteAddr <= ramWriteAddr_debug when '1',
  124.                 aluResult when '0';
  125.     with ramInsertMode_debug select
  126.         ramWriteData <= ramWriteData_debug when '1',
  127.                 reafFata2 when '0';
  128.        
  129.            
  130.            
  131.     with regDst select --Beschreibung des ersten MUXs
  132.         writeReg <= testInstruction_debug(20 downto 16) when '0',
  133.                 testInstruction_debug(15 downto 11) when '1';
  134.                
  135.     with memToReg select -- Beschreibung zweites MUXs
  136.         muxRamOut <= ramElements_debug when '0',
  137.               aluRes when '1';
  138.              
  139.     with or_out select -- Beschreibung des dritten MUXs
  140.         mux3 <= add1 when '0',
  141.             add2 when '1';
  142.                
  143.     with aluSrc select -- Beschreibung des vierten MUXs
  144.         muxalu <= resdData2 when '0',
  145.               signExtendNumber when '1';
  146.        
  147.                
  148.     signextend : entity work.signExtend.vhd --Beschreibung des SignExtend
  149.         generic map(INPUT_WIDTH => '16',
  150.                     OUTPUT_WIDTH => '32')
  151.         port map(number => testInstruction_debug(15 downto 0),
  152.                 signExtNumber(31 downto 0) => signExtendNumber(31 downto 0));
  153.                
  154.        
  155.         shiftleft2 : entity work.leftShifter --Beschreibung ShiftLeft
  156.         generic map(WIDTH => '32'
  157.             SHIFT_AMOUNT => '2')
  158.         port map(number(31 downto 0) => signExtendNumber(WIDTH - 1 downto 0)
  159.                 shiftedNumber(31 downto 0) => shiftedNumber(31 downto 0));
  160.                    
  161.         alucontrol : entity work.aluCtrl --Beschreibung ALU Control
  162.         port map(f(5 downto 0) => testInstruction_debug(5 downto 0),
  163.                 aluOp(1 downto 0) => aluOp(1 downto 0),
  164.                 operation(3 downto 0) => peration(3 downto 0));
  165.    
  166.     alu : entity work.mipsAlu -- Beschreibung ALU
  167.         port map(ctrl(3 downto 0) => operation(3 downto 0),
  168.                 a(4 downto 0) => readData1(4 downto 0),
  169.                 b(4 downto 0) => muxalu(4 downto 0),
  170.                 result(4 downto 0) => aluResult(4 downto 0),
  171.                 zero => zero);
  172.            
  173.                
  174.         -- Beschreibung Addierers
  175.            
  176.             add1 <= 4 + addr_pc;
  177.             add2 <= add1 + shiftedNumber;
  178.            
  179.         --Beschreibung BinToChars
  180.         binToChar1 : entity work.bin2Char
  181.         port(bin => addr_pc(3 downto 0);
  182.          bitmask => pc7SegDigits_debug(0);
  183.          
  184.     binToChar2 : entity work.bin2Char
  185.         port(bin => addr_pc(7 downto 4);
  186.          bitmask => pc7SegDigits_debug(1);
  187.        
  188.     binToChar3 : entity work.bin2Char
  189.         port(bin => addr_pc(11 downto 8);
  190.          bitmask => pc7SegDigits_debug(2);
  191.        
  192.         binToChar4 : entity work.bin2Char
  193.         port(bin => addr_pc(15 downto 12);
  194.          bitmask => pc7SegDigits_debug(3);
  195.          
  196.        
  197.         --Beschreibung von RegFile 
  198.         regFile : entity.work.regFile
  199.             generic map(NUM_REGS => '32';
  200.             LOG2_NUM_REGS => '5';
  201.             REG_WIDTH => '32');
  202.             port map(clk => clk,
  203.                  rst => rst,
  204.                  readAddr1 => instructions(25 downto 21),-- in
  205.              readData1 => readData1, --out
  206.              readAddr2 => instructions(20 downto 16), --in
  207.              readData2 => readData2, --out
  208.              writeEn => regWrite; -- Eingang hier, Ausgang von MIPS Control
  209.              writeAddr => writeReg, -- eingang WriteRegister, Ausgang des ersten MUXs
  210.              writeData => muxRamOut, -- eingang WriteData = Ausgang des zweiten MUXs
  211.              reg_vect_debug => registers_debug;)
  212.            
  213.    
  214.     -- Instruction Memory
  215.     INSTR_ROM: entity work.flashROM(behavioral) -- nutzen Worte (4 Bits) -- PC auf 4 teilen
  216.         generic map(NUM_ELEMENTS => ,
  217.                     LOG2_NUM_ELEMENTS => ,
  218.                     ELEMENT_WIDTH => '32',
  219.                     INIT_FILE_NAME => PROG_FILE_NAME)
  220.         port map(address => addr_pc -- pc_next_debug?,
  221.                  readData => instruction_rom);
  222.    
  223.     -- Data Memory
  224.     DATA_RAM: entity work.flashRAM(behavioral)
  225.         generic map(NUM_ELEMENTS => '1024' ,
  226.                     LOG2_NUM_ELEMENTS => '10' ,
  227.                     ELEMENT_WIDTH => '32',
  228.                     INIT_FILE_NAME => DATA_FILE_NAME)
  229.         port map(clk => invClk,
  230.                  address => ramWriteAddr,
  231.                  writeEn => ramWriteEn, -
  232.                  writeData => ramWriteData,
  233.                  readEn => memRead,
  234.                  readData => muxRamOut,
  235.                  ramElements_debug => ramElements_debug);
  236.  
  237. end architecture;
  238.  
  239.  
  240. --Kommentare und Fragen:
  241. --1. Muss man PC aus einer entity instanzieirung oder selber schreiben? pc_next_debug = Ausgang, Augang des dritten MUXes = Eingang
  242. --
  243. --3. Fehlt: Verstaendnis zum PC, INSTR_ROM Generic
  244. --4 Ueberall Laenge checken und mit Vorgaben vergleichen
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement