2017-01-04 5 views
0

pic16f684のVHDLで算術論理ユニットを作る必要があります。 したがって、ALUの命令は、pic16f684のデータシートに記載されています。vhdlで算術論理ユニットを作る

私が作る必要がある命令は次のとおりです。

These are the instructions

をSTD_LOGIC_VECTORが文字を持つことができないというエラー、かなりロジックである、これはこれまでのところ私のコードですが、私は得ますベクトルでは、私は他の方法でそれを行う方法を知らない。

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.all; 
USE IEEE.STD_LOGIC_ARITH.all; 
USE IEEE.STD_LOGIC_UNSIGNED.all; 

ENTITY AluPIC IS 

    PORT( -- Input Signals  
     Op_code  : in std_logic_vector(6 DOWNTO 0); 
     win, fin  : in std_logic_vector(7 DOWNTO 0); 
     -- Output Signals 
     d,z : out std_logic; 
     ALU_output : out std_logic_vector(7 DOWNTO 0)); 


END AluPIC; 

ARCHITECTURE behavior OF AluPIC IS 
     -- declare signal(s) internal to module here 
SIGNAL temp_output,wout,fout: std_logic_vector(7 DOWNTO 0); 

BEGIN 
    PROCESS (Op_code, win, fin) 
    BEGIN 
     -- Select Arithmetic/Logical Operation 
    CASE Op_Code (6 DOWNTO 0) IS 
     WHEN "000111d" => 
      if d ='0' then 
       wout <= win + fin; 
       temp_output <=wout; 
      else 
       fout <= win + fin; 
       temp_output <= fout; 
      end if; 

     WHEN "000101d" => 
      if d ='0' then 
       wout <= win and fin; 
       temp_output <= wout; 
      else 
       fout <= win and fin; 
       temp_output <= fout; 
      end if; 

     WHEN "000001l" => 
      fout <= fin; 
      fout <= "00000000"; 
      z <= '1'; 
      temp_output <= fout; 

     WHEN "001010d" => 
      fout <= fin+1; 
      if d = '0' then 
       wout <= fout; 
       temp_output <=wout; 
      else 
       fout <= fout; 
       temp_output <=fout; 
      end if; 

     WHEN "001000d" => 
     if d = '0' then 
      wout <= fin; 
      temp_output <= wout; 
      z <= '1'; 
     else 
      fout <= fin; 
      temp_output <= fout; 
      z <= '1'; 
     end if; 

     WHEN "0101bbb" => 
      fout <= fin; 
      temp_output <= fout; 
     WHEN OTHERS => 
      temp_output <= "00000000"; 
    END CASE; 
      -- Select Shift Operation 
    IF Op_Code(0) = '1' THEN 
      -- Shift bits left with zero fill using concatination operator 
      -- can also use VHDL 1076-1993 shift operator such as SLL 
     Alu_output <= temp_output(6 DOWNTO 0) & '0'; 
    ELSE 
     Alu_output <= temp_output; 
    END IF; 
    END PROCESS; 
END behavior; 

ありがとう、あなたの時間のみんな!あなたのcase文がstd_logic_vectorを使用しますが、"000111d"が文字列であるため、WHEN "000111d" =>WHEN "0101bbb" =>などの

答えて

0

行は、有効ではありません。

あなたのdb文字で達成しようとしているものは明らかではないが、あなたの様々なwhenラインは、たとえばWHEN "0000111" =>のために、適切な長さの有効std_logic_vectorと比較すべきです。

オペコードイメージを見ると、「ADDWF」などの操作を含む行を含む表が表示されます。これらの演算では、最上位6ビットのみが演算を選択するように見え、最下位ビットはbまたはdと表示されます。この最下位ビットは実際にはオペレーションのパラメータであり、オペコードの一部ではありません。この表は、dがどのような影響を与えているかを示していませんが、これを解決したようです。例としてADDWFを使用して、私はこのようにコードを変更します

CASE Op_Code (6 DOWNTO 1) IS 
    WHEN "000111" => 
    if Op_Code(0) ='0' then 
     wout <= win + fin; 
     temp_output <=wout; 
    else 
     fout <= win + fin; 
     temp_output <= fout; 
    end if; 
    -- ... 
end case; 

「BSF」操作は、それがパラメータとして最下位の3ビットを使用すると、例外です。 VHDL2008を必要とし、

マッチングケース:あなたは、一致するcase文を使用してのいずれかにこれを書き、または1つの場合のすべての可能性を列挙することによってでき

CASE? Op_Code (6 DOWNTO 1) IS 
    WHEN "0101--" => 
    -- Set a bit based on `op_code (2 downto 0)` 
end case?; 

一覧をあらゆる可能性:

CASE Op_Code (6 DOWNTO 1) IS 
    WHEN "010100" | "010101" | "010110" | "010111" => 
    -- Set a bit based on `op_code (2 downto 0)` 
end case; 
+0

イェので、それははっきりしていましたが、どうやってこれを他の方法で解決できますか?命令を見ると、01bbが使用され、この命令をどのようにしてstd_logic_vectorに入れることができるのでしょうか? – Faalhaaz

+0

'bb'や' d'の意味を理解し、適切な変更を加えるために、PICのマニュアルをもっと深く読まなければなりません。 –

+0

ok @Faalhaaz私は質問を理解したと思う、私の編集を参照してください。 –