1

首先,我对 C 的了解非常有限,只有基本功能。我已经在 VHDL 中设置了一项我没有经验的任务。

任务是用 VHDL 编写一个程序,该程序将使用循环添加 10 个数字(13、8、6、5、19、21、7、1、12、3)的列表。

即使在 C 中,我也在想一种方法,看看我是否可以在某种程度上模仿这种方法。到目前为止,我只想出了

    int start = 0;
    int add = start;
    int increment = 5;

    for (int i=0; i<10; i++) {
    add = add + increment;
    }

现在我知道这是非常基本的,但这是我能做的最好的。该循环只会将它增加 5,就像我拥有的​​列表一样。

非常感谢任何帮助,这是我的第一个问题,如果我违反任何“不成文的法律”,我深表歉意

4

3 回答 3

1

首先,我要指出没有必要用 and 增加 s 或向量算术的复杂std_logic_vector性。这适用于简单的整数:signedunsigned

所以,你有一些数字进来,一个总和出去:

entity summer
port (
  inputs : integer_vector := (13,8,6,5,19,21,7,1,12,3);
  sum_out : integer);
end entity summer;

请注意,我已经用您的值初始化了输入端口 - 通常您会在测试台中写入该端口。

现在要将它们相加,您需要一个过程:

process(inputs)
    variable sum : integer;
begin
    sum := 0;
    for i in inputs'range loop
        sum := sum + inputs(i);
    end for;
    sum_out <= sum;
end process;

这是一个简单的解决方案 - 要创建“最佳”解决方案,您需要更详细的规范。例如:输入多久会改变一次?输入更改后多久需要答案?有时钟吗?

于 2013-02-22T13:28:23.960 回答
1

您提到这是对 parwan 处理器研究的一部分,因此考虑它的方式很大程度上取决于您如何研究它们。

如果您正在构建处理器的实现,而不仅仅是学习逻辑运算的语法是重要的部分,您应该关注类型 unsigned range 0 to 255signed range -128 to 127. 通过使用包ieee.numeric_std.all,您可以获得为这些类型定义的添加操作。

但是,如果已经为您定义了处理器,请仔细查看处理器接口。您将为此编写的代码将更像是一个显式状态机。

无论哪种方式,我发现最好的开始方法是编写一个测试台。这是将在输入列表中提供的部分,因为最终您不希望它是一种处理方式for (int i=0; i<10; i++),而是一种while(1)处理方式。

这都是理论的东西,所以这里有一些简单的累加器过程的伪代码:

signal acc : unsigned range 0 to 255 := 0; --accumulator register
signal b : unsigned range 0 to 255 := 5;   --value to be added 
--each cycle you would change b

accumulator :process (clk)
begin
    if rising_edge(clk)
        acc <= acc + b;
    end if;
end process;

或者也许更好看看这里:累加器

于 2013-02-21T21:25:11.247 回答
1

下面的解决方案可以帮助您开始使用 VHDL 解决问题:

对于在 FPGA 中的实现,可以找到更好的解决方案。所以,把它当作一个开始......

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity add is

    port (
        clk : in  std_logic;
        rst : in  std_logic;
        add : in  std_logic;
        sum : out std_logic_vector(31 downto 0));

end entity add;

architecture RTL of add is

    constant rom_size : integer := 10;
    type     t_rom is array (0 to rom_size-1) of unsigned(31 downto 0);
    constant rom : t_rom := (
        to_unsigned(13, sum'length),
        to_unsigned(8, sum'length),
        to_unsigned(6, sum'length),
        to_unsigned(5, sum'length),
        to_unsigned(19, sum'length),
        to_unsigned(21, sum'length),
        to_unsigned(7, sum'length),
        to_unsigned(1, sum'length),
        to_unsigned(12, sum'length),
        to_unsigned(3, sum'length));
    signal add_d : std_logic;
    signal index : integer range 0 to rom_size;
    signal sum_i : unsigned(sum'range);

begin

    p_add : process (clk) is
    begin
        if rising_edge(clk) then        -- rising clock edge
            if rst = '1' then           -- synchronous reset (active high)
                sum_i <= (others => '0');
                add_d <= '0';
                index <= 0;
            else

                add_d <= add;           -- rising edge detection

                if add_d = '0' and add = '1' then  -- rising_edge -> add next item to sum
                    sum_i <= sum_i + rom(index);
                    index <= index + 1;
                end if;
            end if;
        end if;
    end process p_add;


    -- output
    sum <= std_logic_vector(sum_i);

end architecture RTL;

在此处输入图像描述

于 2013-02-21T14:13:16.873 回答