Advertisement
madegoff

MIPS_CPU

Jan 14th, 2023 (edited)
627
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 8.10 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(9 downto 0);
  64. signal ramWriteData : std_logic_vector(31 downto 0);
  65. signal ramReadData : std_logic_vector(31 downto 0);
  66.  
  67. --Signale Sign Extend
  68. signal signExtendNumber : std_logic_vector(31 downto 0);
  69.  
  70. --Signale Shift Left 2
  71. signal shiftedNumber : std_logic_vector(31 downto 0);
  72.  
  73. --Signale ALU Control
  74. signal operation : std_logic_vector(3 downto 0);
  75.  
  76. --Signale ALU
  77. signal aluResult : std_logic_vector(31 downto 0);
  78. signal zero : std_logic;
  79. --zusaetzliche Signale
  80. signal muxalu : std_logic_vector(31 downto 0); -- auch der 4. MUX
  81. signal mux3 : std_logic_vector(31 downto 0);
  82. signal muxRamOut : std_logic_vector(31 downto 0); -- auch der 2. Mux
  83. signal muxRamIn : std_logic_vector(31 downto 0);
  84.  
  85. signal invClk : std_logic; -- invert clk
  86.  
  87. signal and_out : std_logic;
  88.  
  89.  
  90. --Signale Addierer
  91. signal add2 : std_logic_vector(31 downto 0);
  92. signal add1: std_logic_vector(31 downto 0);
  93.  
  94.  
  95. begin
  96.  
  97.     invClk <= not clk;
  98.  
  99.  
  100.     with testMode_debug select
  101.         instruction <= testInstruction_debug when '1',
  102.         instruction_rom when others;
  103.  
  104.     -- Beschreibung der MIPS-CPU ergänzen
  105.    
  106.    
  107.     control: entity work.mipsCtrl(structural)  --Beschreibung des Control MIPS
  108.         port map( op(5 downto 0) => instruction(31 downto 26),
  109.             regDst => regDst,
  110.             branch => branch,
  111.             memRead => memRead,
  112.             memToReg => memToReg,
  113.             aluOp(1 downto 0) => aluOp(1 downto 0),
  114.             memWrite => memWrite,
  115.             aluSrc => aluSrc,
  116.             regWrite => regWrite);
  117.            
  118.     and_out <= branch and zero;
  119.    
  120.    
  121.     --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)
  122.     --ramWriteEn_debug : in std_logic;
  123.     --ramWriteAddr_debug : in std_logic_vector(LOG2_NUM_RAM_ELEMENTS - 1 downto 0);
  124.     --ramWriteData_debug : in std_logic_vector(RAM_ELEMENT_WIDTH - 1 downto 0);
  125.    
  126.     with ramInsertMode_debug select -- Beschreibung des MUX vor dem RAM (Kommentar oben)
  127.         ramWriteEn <= ramWriteEn_debug when '1',
  128.                   memWrite when others;
  129.     with ramInsertMode_debug select
  130.         ramWriteAddr <= ramWriteAddr_debug when '1',
  131.                 aluResult(11 downto 2) when others;
  132.     with ramInsertMode_debug select
  133.         ramWriteData <= ramWriteData_debug when '1',
  134.                 readData2 when others;
  135.        
  136.            
  137.            
  138.     with regDst select --Beschreibung des ersten MUXs
  139.         writeReg <= instruction(20 downto 16) when '0',
  140.                 instruction(15 downto 11) when others;
  141.                
  142.     with memToReg select -- Beschreibung zweites MUXs
  143.         muxRamOut <= ramReadData when '1',
  144.               aluResult when others;
  145.              
  146.     with and_out select -- Beschreibung des dritten MUXs
  147.         mux3 <= add1 when '0',
  148.             add2 when others;
  149.                
  150.     with aluSrc select -- Beschreibung des vierten MUXs
  151.         muxalu <= readData2 when '0',
  152.               signExtendNumber when others;
  153.        
  154.                
  155.     signextend : entity work.signExtend(behavioral) --Beschreibung des SignExtend
  156.         generic map(INPUT_WIDTH => 16,
  157.                     OUTPUT_WIDTH => 32)
  158.         port map(number => signed(instruction(15 downto 0)),
  159.                 std_logic_vector(signExtNumber) => signExtendNumber(31 downto 0)); --(31 downto 0) rechts - noetig?
  160.                
  161.        
  162.         shiftleft2 : entity work.leftShifter --Beschreibung ShiftLeft
  163.         generic map(WIDTH => 32,
  164.             SHIFT_AMOUNT => 2)
  165.         port map(number => signExtendNumber,
  166.                 shiftedNumber => shiftedNumber);
  167.                    
  168.         alucontrol : entity work.aluCtrl --Beschreibung ALU Control
  169.         port map(f(5 downto 0) => instruction(5 downto 0),
  170.                 aluOp(1 downto 0) => aluOp(1 downto 0),
  171.                 operation(3 downto 0) => operation(3 downto 0));
  172.    
  173.     alu : entity work.mipsAlu -- Beschreibung ALU
  174.         generic map(WIDTH => 32)
  175.         port map(ctrl(3 downto 0) => operation(3 downto 0),
  176.                 a => readData1,
  177.                 b => muxalu,
  178.                 result => aluResult,
  179.                 zero => zero);
  180.            
  181.                
  182.         -- Beschreibung Addierers
  183.            
  184.         add1 <= std_logic_vector(4 + unsigned(addr_pc));
  185.         add2 <= std_logic_vector(unsigned(add1) + unsigned(shiftedNumber));
  186.            
  187.         --Beschreibung BinToChars
  188.         binToChar1 : entity work.bin2Char
  189.         port map(bin => addr_pc(3 downto 0),
  190.          bitmask => pc7SegDigits_debug(0));
  191.          
  192.     binToChar2 : entity work.bin2Char
  193.         port map(bin => addr_pc(7 downto 4),
  194.          bitmask => pc7SegDigits_debug(1));
  195.        
  196.     binToChar3 : entity work.bin2Char
  197.         port map(bin => addr_pc(11 downto 8),
  198.          bitmask => pc7SegDigits_debug(2));
  199.        
  200.         binToChar4 : entity work.bin2Char
  201.         port map(bin => addr_pc(15 downto 12),
  202.          bitmask => pc7SegDigits_debug(3));
  203.          
  204.        
  205.         --Beschreibung von RegFile 
  206.         regFile : entity work.regFile
  207.             generic map(NUM_REGS => 32,
  208.             LOG2_NUM_REGS => 5,
  209.             REG_WIDTH => 32)
  210.             port map(clk => clk,
  211.                  rst => rst,
  212.                  readAddr1 => instruction(25 downto 21),-- in
  213.              readData1 => readData1, --out
  214.              readAddr2 => instruction(20 downto 16), --in
  215.              readData2 => readData2, --out
  216.              writeEn => regWrite, -- Eingang hier, Ausgang von MIPS Control
  217.              writeAddr => writeReg, -- eingang WriteRegister, Ausgang des ersten MUXs
  218.              writeData => muxRamOut, -- eingang WriteData = Ausgang des zweiten MUXs
  219.              reg_vect_debug => registers_debug);
  220.            
  221.    
  222.     -- Instruction Memory
  223.     INSTR_ROM: entity work.flashROM(behavioral) -- nutzen Worte (4 Bits) -- PC auf 4 teilen
  224.         generic map(NUM_ELEMENTS => 1024,
  225.                     LOG2_NUM_ELEMENTS => 10,
  226.                     ELEMENT_WIDTH => 32,
  227.                     INIT_FILE_NAME => PROG_FILE_NAME)
  228.         port map(address => addr_pc(11 downto 2), -- pc_next_debug?
  229.                  readData => instruction_rom);
  230.    
  231.     -- Data Memory
  232.     DATA_RAM: entity work.flashRAM(behavioral)
  233.         generic map(NUM_ELEMENTS => 1024 ,
  234.                     LOG2_NUM_ELEMENTS => 10,
  235.                     ELEMENT_WIDTH => 32,
  236.                     INIT_FILE_NAME => DATA_FILE_NAME)
  237.         port map(clk => invClk,
  238.                  address => ramWriteAddr,
  239.                  writeEn => ramWriteEn,
  240.                  writeData => ramWriteData,
  241.                  readEn => memRead,
  242.                  readData => ramReadData,
  243.                  ramElements_debug => ramElements_debug);
  244.                  
  245.     PC: entity work.reg --Beschreibung PC
  246.     generic map(
  247.         WIDTH => 32)
  248.     port map(
  249.         clk => clk,
  250.         rst => rst,
  251.         en  => testMode_debug, -- kA obs richtig is
  252.         D  => mux3,-- in, Ausgang 3 MUXs
  253.         Q  => addr_pc); -- out
  254.        
  255.     pc_next_debug <= mux3;
  256.  
  257. end architecture;
  258.  
  259.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement