【发布时间】: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