Vhdl 带反馈的相位累加器
我正在尝试使用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
- 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
beforelibrary
,并使用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;