Advertisement
Guest User

Untitled

a guest
Jul 10th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 5.50 KB | None | 0 0
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4.  
  5. entity risc_v is
  6.     port(
  7.         clk : std_logic;
  8.         clk_mem : std_logic;
  9.         rst : std_logic
  10.     );
  11. end entity;
  12.  
  13. architecture arch of risc_v is
  14.    
  15.     -- Sinais de memória (endereço e valores lidos)
  16.     signal instr_address : std_logic_vector(7 downto 0) := x"00"; -- Endereço (de word) de instrução à ser lido
  17.     signal data_address: std_logic_vector(7 downto 0) := x"00"; -- Endereço (de word) da memória à ser lido
  18.     signal read_data: std_logic_vector(31 downto 0); -- Dado lido da memória de dados
  19.     signal wb_data: std_logic_vector(31 downto 0); -- Dado que vai ser reescrito no registrador
  20.    
  21.     -- Sinais de PC
  22.     signal pc_temp, pc_4, pc_offset : std_logic_vector(31 downto 0);
  23.     signal pc : std_logic_vector(31 downto 0) := x"00000000";
  24.    
  25.     -- Sinais de controle
  26.     signal zero, alusrc, mem2reg, memread, memwrite, branch, regwrite : std_logic;
  27.     signal aluop : std_logic_vector(1 downto 0);
  28.    
  29.     -- Sinais da ULA
  30.     signal A, B, Z, ro1, ro2 : std_logic_vector(31 downto 0);
  31.     signal aluctr: std_logic_vector(3 downto 0);
  32.    
  33.     -- Sinais da instrução
  34.     signal instr : std_logic_vector(31 downto 0);
  35.    
  36.     alias rs1    : std_logic_vector(4 downto 0) is instr(19 downto 15);
  37.     alias rs2 : std_logic_vector(4 downto 0) is instr(24 downto 20);
  38.     alias rd : std_logic_vector(4 downto 0) is instr(11 downto 7);
  39.     alias opcode : std_logic_vector(6 downto 0) is instr(6 downto 0);
  40.     alias funct7 : std_logic_vector(6 downto 0) is instr(31 downto 25);
  41.     alias funct3 : std_logic_vector(2 downto 0) is instr(14 downto 12);
  42.    
  43.     -- Sinais do gerador de imediatos
  44.     signal imm32: std_logic_vector(31 downto 0);
  45.    
  46.     constant c_four : std_logic_vector(31 downto 0) := x"00000004";
  47.    
  48.     -- Componentes (utilizar package!!!)
  49.     component ula_rv is
  50.         port (
  51.             op      : in std_logic_vector(3 downto 0);
  52.             A, B            : in std_logic_vector(31 downto 0);  
  53.             Z           : out std_logic_vector(31 downto 0);  
  54.             zero        : out std_logic);
  55.     end component;
  56.    
  57.     component control IS
  58.         PORT (
  59.             opcode : IN std_logic_vector(6 DOWNTO 0);
  60.             aluop: OUT std_logic_vector(1 DOWNTO 0);
  61.             alusrc, mem2reg, regwrite, memread, memwrite, branch : OUT std_logic
  62.         );
  63.     END component;
  64.    
  65.     component alu_control IS
  66.         PORT (
  67.             funct7 : IN std_logic_vector(6 DOWNTO 0);
  68.             funct3 : IN std_logic_vector(2 DOWNTO 0);
  69.             aluop : IN std_logic_vector(1 DOWNTO 0);
  70.             aluctr : OUT std_logic_vector(3 DOWNTO 0)
  71.         );
  72.     END component;
  73.    
  74.     component data_mem IS
  75.         PORT
  76.         (
  77.             address     : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
  78.             clock       : IN STD_LOGIC  := '1';
  79.             data        : IN STD_LOGIC_VECTOR (31 DOWNTO 0);
  80.             wren        : IN STD_LOGIC ;
  81.             q       : OUT STD_LOGIC_VECTOR (31 DOWNTO 0)
  82.         ); 
  83.     END component;
  84.  
  85.     component instr_mem IS
  86.         PORT
  87.         (
  88.             address     : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
  89.             clock       : IN STD_LOGIC  := '1';
  90.             data        : IN STD_LOGIC_VECTOR (31 DOWNTO 0);
  91.             wren        : IN STD_LOGIC ;
  92.             q       : OUT STD_LOGIC_VECTOR (31 DOWNTO 0)
  93.         ); 
  94.     END component;
  95.    
  96.     component XREGS is
  97.         generic (WSIZE : natural := 32);
  98.         port
  99.         (
  100.             clk, wren, rst : in std_logic;
  101.             rs1, rs2, rd : in std_logic_vector(4 downto 0);
  102.             data : in std_logic_vector(WSIZE-1 downto 0);
  103.             ro1, ro2 : out std_logic_vector(WSIZE-1 downto 0)
  104.         );
  105.     end component;
  106.    
  107.     component genImm is
  108.         port (
  109.             instr : in std_logic_vector(31 downto 0);
  110.             imm32 : out std_logic_vector(31 downto 0)
  111.         );
  112.     end component;
  113.    
  114.     component adder is
  115.         generic (DATA_WIDTH : natural := 32);
  116.         port
  117.         (
  118.             a      : in std_logic_vector  ((DATA_WIDTH-1) downto 0);
  119.             b      : in std_logic_vector  ((DATA_WIDTH-1) downto 0);
  120.             result : out std_logic_vector((DATA_WIDTH-1) downto 0)
  121.         );
  122.     end component;
  123.  
  124.    
  125. begin
  126.     instr_address <= pc(9 downto 2); -- O endereço de instrução é determinado pelo PC/4.
  127.     data_address <= Z(9 downto 2); -- O endereço de dados é determinado pelo Z/4 (Z = saida da ULA).
  128.    
  129.     controller:
  130.         control port map(
  131.          opcode => opcode,
  132.          memread => memread,
  133.          mem2reg => mem2reg,
  134.          memwrite => memwrite,
  135.          alusrc => alusrc,
  136.          regwrite => regwrite,
  137.             aluop => aluop,
  138.             branch => branch
  139.         );
  140.    
  141.     registers :
  142.         XREGS port map(
  143.             clk => clk,
  144.             wren => regwrite,
  145.             rst => rst,
  146.             rs1 => rs1,
  147.             rs2 => rs2,
  148.             rd => rd,
  149.             data => wb_data,
  150.             ro1 => ro1,
  151.             ro2 => ro2
  152.         );
  153.    
  154.     imm :
  155.         genImm port map(
  156.             instr => instr,
  157.             imm32 => imm32
  158.         );
  159.    
  160.     controller_alu :
  161.         alu_control port map(
  162.             funct3 => funct3,
  163.             funct7 => funct7,
  164.             aluop => aluop,
  165.             aluctr => aluctr
  166.         );
  167.        
  168.     data_memory :
  169.         data_mem port map(
  170.             address => data_address,
  171.             clock => clk_mem,
  172.             data => ro2,
  173.             wren => memwrite,
  174.             q => read_data
  175.         );
  176.     instr_memory :
  177.         instr_mem port map(
  178.             address => instr_address,
  179.             clock => clk_mem,  
  180.             data => ro2,
  181.             wren => '0',
  182.             q => instr     
  183.         );
  184.        
  185.     adder_4 :
  186.         adder port map(
  187.             A => pc,
  188.             B => c_four,
  189.             result => pc_4
  190.         );
  191.    
  192.     adder_imm :
  193.         adder port map(
  194.             A => pc,
  195.             B => imm32,
  196.             result => pc_offset
  197.         ); 
  198.        
  199.     pc_temp <= pc_4 when ((branch and zero) = '0') else pc_offset;
  200.    
  201.     -- Multiplexação para decidir as entradas da ULA
  202.     A <= ro1;
  203.     B <= ro2 when (alusrc = '0') else imm32;
  204.    
  205.     alu :
  206.     ula_rv port map(
  207.         op => aluctr,
  208.         A => A,
  209.         B => B,
  210.         Z => Z,
  211.         zero => zero
  212.         );
  213.        
  214.  
  215.     -- Multiplexação para definir o valor de write-back
  216.     wb_data <= Z when (mem2reg = '0') else read_data;
  217.    
  218.     process(clk)
  219.     begin
  220.         if(rising_edge(clk)) then
  221.             pc <= pc_temp;
  222.         end if;
  223.     end process;
  224. end architecture;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement