【问题标题】:Make an arithmetic logic unit in vhdl在 vhdl 中创建一个算术逻辑单元
【发布时间】:2017-01-04 09:53:21
【问题描述】:

我需要用 VHDL 为 pic16f684 创建一个算术逻辑单元。 所以ALU的说明可以在pic16f684的datasheet中找到。

我需要做的说明如下:

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;

感谢你们的时间!

【问题讨论】:

    标签: vhdl quartus alu


    【解决方案1】:

    WHEN "000111d" =&gt;WHEN "0101bbb" =&gt; 之类的行无效,因为您的case 语句使用std_logic_vector,但"000111d" 是一个字符串。

    尚不清楚您要使用db 字符实现什么,但您的各种when 行应与正确长度的有效std_logic_vector 进行比较,例如WHEN "0000111" =&gt;

    查看您的操作码图像,它显示了一个表格,其中包含包含操作的行,例如“ADDWF”。在这些操作中,似乎只有最高有效 6 位选择操作,最低有效位标记为bd。这个最低有效位实际上是操作的参数,而不是操作码的一部分。该表没有显示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 位作为参数。您可以使用匹配的 case 语句来编写此代码,也可以在一个 case 中列出所有可能性:

    匹配案例,需要VHDL2008:

    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;
    

    【讨论】:

    • 是的,到目前为止这很清楚,但我该如何以其他方式解决这个问题?因为如果你看说明,使用的是01bb,我怎样才能把这个说明放在std_logic_vector中?
    • 您必须更深入地阅读 PIC 手册以了解 bbd 的含义并进行适当的更改。
    • ok @Faalhaaz 我想我理解了这个问题,请查看我的编辑。
    • 非常感谢!,它不仅给了我解决方案,而且现在我确实理解了很多!
    • 顺便说一句@scary_jeff,?在case语句之后,是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2017-08-15
    • 2011-04-11
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多