Vhdl 带反馈的相位累加器

Vhdl 带反馈的相位累加器,vhdl,feedback,accumulator,phase,Vhdl,Feedback,Accumulator,Phase,我正在尝试使用VHDL创建具有以下特征的相位累加器 投入: D(输入信号) 重置 行政长官 时钟 产出: Q(输出信号-反馈) 源代码: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Phase_accu is port ( D : in std_logic_vector(3 downto

我正在尝试使用VHDL创建具有以下特征的相位累加器

投入:

  • D(输入信号)
  • 重置
  • 行政长官
  • 时钟
产出:

  • Q(输出信号-反馈)
源代码:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Phase_accu is
port (
    D       : in std_logic_vector(3 downto 0);
    CE      : in std_logic;
    CLK     : in std_logic;
    RESET   : in std_logic;
    Q       : out std_logic_vector(15 downto 0)
);
end Phase_accu;

architecture Behavioral of Phase_accu is
begin

process(D, CE, CLK, RESET)
    begin
        if RESET = '1' then
            Q <= "0000000000000000";
        elsif rising_edge(CLK) then
            if CE = '1' then
                Q <= ("000000000000" & D) + Q;
            end if;
        end if;
end process;

end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.STD_LOGIC_ARITH.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
实体相位_accu为
港口(
D:标准逻辑向量(3到0);
CE:标准逻辑;
CLK:标准逻辑中;
复位:在标准逻辑中;
Q:输出标准逻辑向量(15到0)
);
结束相位_accu;
相位_accu的架构(architecture)
开始
过程(D、CE、CLK、复位)
开始
如果重置='1',则

Q在VHDL-2008之前的VHDL版本中,无法读取
out
的值。解决这一问题的通常方法是拥有输出的内部副本,并在需要获取其值时使用该内部副本:

[...]
Q : out std_logic_vector(15 downto 0);
[...]
signal Q_reg : std_logic_vector(15 downto 0);

process(D, CE, CLK, RES)
    begin

        if RES = '1' then
            Q_reg <= "0000000000000000";
        elsif rising_edge(CLK) then
            if CE = '1' then
                Q_reg <= ("000000000000" & D) + Q_reg;
            end if;
        end if;
end process;

Q <= Q_reg;
[…]
Q:输出标准逻辑向量(15到0);
[...]
信号Q_reg:std_逻辑_向量(15向下至0);
过程(D、CE、CLK、RES)
开始
如果RES='1',则

Q_reg我建议使用数字标准库,而不是标准逻辑算术和标准逻辑无符号。我还建议对向量大小规范进行一些小的优化

敏感度列表也有两个多条目。您必须删除D和CE来描述具有异步重置的有效时钟进程。有关详细信息,请参阅合成工具手册

这使得上面的代码

ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体相位_accu为
港口(
D:标准逻辑向量(3到0);
CE:标准逻辑;
CLK:标准逻辑中;
复位:在标准逻辑中;
Q:输出标准逻辑向量(15到0)
);
结束相位_accu;
相位_accu的架构(architecture)
信号Q_reg:无符号(Q'范围);
开始
过程(时钟、RES)
开始
如果RES='1',则
Q_reg“0”);
elsif上升沿(CLK)则
如果CE='1',则

我现在明白了。非常感谢您的帮助。:)在代码的第一行删除多余的
use
before
library
,并使用VHDL revision-2008对代码进行分析和阐述(可以在-2008年评估模式输出端口)。请提供一条完整的错误消息,并确认您的工具正在执行的操作,不能保证问题按原样重现。
[...]
Q : out std_logic_vector(15 downto 0);
[...]
signal Q_reg : std_logic_vector(15 downto 0);

process(D, CE, CLK, RES)
    begin

        if RES = '1' then
            Q_reg <= "0000000000000000";
        elsif rising_edge(CLK) then
            if CE = '1' then
                Q_reg <= ("000000000000" & D) + Q_reg;
            end if;
        end if;
end process;

Q <= Q_reg;