Error adding std_logic_vectors

前端 未结 4 1267
难免孤独
难免孤独 2020-12-05 05:12

I wanna have a simple module that adds two std_logic_vectors. However, when using the code below with the + operator it does not synthesize.

library IEE         


        
相关标签:
4条回答
  • 2020-12-05 05:50

    Don't use std_logic_arith - I've written about this (at some length :).

    Do use numeric_std - and do use the right type on your entity ports. If you are doing arithmetic, use numerical types (either integers, or (un)signed vectors, as appropriate). They'll synthesise perfectly well.

    std_logic_vectors are good for

    • when you don't care about numerical values (a set of control bits, some random data bits)
    • when you don't know about the type of the input (say an adder which can operate on both signed and unsigned numbers based on a control flag).
    0 讨论(0)
  • 2020-12-05 05:55

    The easy way to solve this error is:
    Add library of unsign,
    After that your code starts to work.

    Use

    ieee.std_logic_unsigned.all;
    pr_out <= pr_in1 + pr_in2;
    
    0 讨论(0)
  • 2020-12-05 06:03

    How do you want the compiler to know if your std_logic_vectors are signed or unsigned ? Adder implementation is not the same in these two cases, so you need to explicitly tell the compiler what you want it to do ;-)

    Note: VHDL syntax highlighting in StackOverflow is crappy. Copy/paste this code in your preferred VHDL editor to read it more easily.

    library IEEE; 
    use IEEE.std_logic_1164.all;
    -- use IEEE.std_logic_arith.all; -- don't use this
    use IEEE.numeric_std.all; -- use that, it's a better coding guideline
    
    -- Also, never ever use IEEE.std_unsigned.all or IEEE.std_signed.all, these
    -- are the worst libraries ever. They automatically cast all your vectors
    -- to signed or unsigned. Talk about maintainability and strong typed language...
    
    entity add_module is
      port(
        pr_in1   : in std_logic_vector(31 downto 0);
        pr_in2   : in std_logic_vector(31 downto 0);
        pr_out   : out std_logic_vector(31 downto 0)  
      );
    end add_module;
    
    architecture Behavior of add_module is
    begin
    
      -- Here, you first need to cast your input vectors to signed or unsigned 
      -- (according to your needs). Then, you will be allowed to add them.
      -- The result will be a signed or unsigned vector, so you won't be able
      -- to assign it directly to your output vector. You first need to cast
      -- the result to std_logic_vector.
    
      -- This is the safest and best way to do a computation in VHDL.
    
      pr_out <= std_logic_vector(unsigned(pr_in1) + unsigned(pr_in2));
    
    end architecture Behavior;
    
    0 讨论(0)
  • 2020-12-05 06:04

    Good advice from @Aurelien to use numeric_std.

    Bear in mind that adding two 32 bit values can result in a 33 bit value and decide how you want to handle the overflow.

    0 讨论(0)
提交回复
热议问题