【问题标题】:VHDL - Increment with one (unsigned)VHDL - 以 1 递增(无符号)
【发布时间】:2015-01-09 18:47:19
【问题描述】:

我正在尝试编写一个代码,将传入的位加一。我想使用两段代码样式,但这里的问题是这些位没有到达输出。任何想法?谢谢!

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;


entity increment1 is
    port(
        from_ASMD_State_reg : in std_logic_vector(7 downto 0);
        reset, clk : in std_logic;
        to_mux : out std_logic_vector(7 downto 0)
    );
end increment1;

architecture Behavioral of increment1 is
--signal count : unsigned(7 downto 0);
signal r_reg : unsigned(7 downto 0);
signal r_next : unsigned(7 downto 0);
begin
process(clk, reset)
begin
    if(reset = '1') then
        to_mux <= (others => '0');
    elsif(clk'event and clk = '1') then
        r_reg <= r_next;
    end if;
end process;

r_next <= r_reg + 1;

to_mux <= std_logic_vector(r_reg);

end Behavioral;

在对代码进行了一些调整后,现在似乎可以正常工作了!

architecture Behavioral of increment1 is
signal r_reg : unsigned(7 downto 0);
signal r_inc : unsigned(7 downto 0);
begin
process(clk, reset, r_reg)
begin
    r_reg <= unsigned(from_ASMD_State_reg);

    if(reset = '1') then
        r_reg <= (others => '0');
    elsif(clk'event and clk = '1') then
        r_reg <= r_inc;
    end if;
end process;

r_inc <= r_reg + 1;

to_mux <= std_logic_vector(r_inc);

end Behavioral;

【问题讨论】:

  • 模块中未使用from_ASMD_State_reg,因此如果这是要递增的输入,则使用它作为开始。另外注意to_mux既是进程内驱动,又是进程外驱动,这样的多个驱动不能综合,很可能在仿真中产生X;意图可能是在进程中驱动r_reg。最后,如果在流程表达式中直接使用r_reg + 1,则可以不用r_next
  • @MortenZilmer 感谢您的回复。只是想知道我应该如何使用 from_ASMD_State_reg 开始?我应该将 r_reg 设置为 from_ASMD_State_reg 吗?我应该在哪里做? :)
  • 这真的取决于你想要实现的功能,所以首先制定一个规范,例如一个表格,列出所有不同输入值的预期输出,在这个过程中你很可能了解您必须在设计中实现哪些功能。
  • @MortenZilmer 我做了一些更改,并将代码粘贴到我的帖子中。你能看看我的代码,看看我的代码中是否还有一些愚蠢的东西吗? :)
  • 您可能不应该在进程内部分配给r_reg,而是在if 块之外分配。

标签: encoding vhdl counter increment fpga


【解决方案1】:

您更新的代码几乎正确,但不完全正确。如果您只想增加并注册一个值,那么您只需要:

architecture Behavioral of increment1 is
begin

  r_inc <= unsigned(from_ASMD_State_reg) + 1;

  process (clk, reset)
  begin
    if(reset = '1') then
        r_reg <= (others => '0');
    elsif(clk'event and clk = '1') then
        r_reg <= r_inc;
    end if;
  end process;

  to_mux <= std_logic_vector(r_reg);

end Behavioral;

(注意:编辑以上内容以修复赋值错误并重新排序语句以使所需的“双段样式”更加明显)

您确定它在您的进程内但在 if 块之外“有效”分配给 r_reg 吗?你试过合成,还是只模拟?

优化:

  • 您可以通过将增量语句直接放入进程中的r_reg 赋值来摆脱r_inc
  • 您可以通过在进程和类型转换中将 r_reg 替换为 to_mux 来摆脱它。

此操作不需要所有这些中间信号。如果您需要将它们用于要添加的其他功能,请随时保留它们,但请注意这些端口可用于这些操作 - 您无需先将它们分配给另一个信号。

您的流程中的简化分配将是:

to_mux <= std_logic_vector(unsigned(from_ASMD_State_reg) + 1);

几乎不值得制作一个单独的组件来执行此操作,但您当然可以。

【讨论】:

    猜你喜欢
    • 2013-10-17
    • 2015-12-29
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多