【发布时间】:2016-02-27 07:46:06
【问题描述】:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity RAM_controler is
port(
clk_50 : in std_logic;
clk_baud : in std_logic;
main_reset : in std_logic;
enable: in std_logic; --active high write enable
in_data : in std_logic_vector(7 downto 0);
W_order : out std_logic;
R_order : out std_logic;
Data_OUT : out std_logic_vector(7 downto 0);
Write_Address_OUT: out std_logic_vector(7 downto 0);
Read_Address_OUT: out std_logic_vector(7 downto 0)
);
end entity RAM_controler;
architecture Behavioral of RAM_controler is
type state is (reset,operation);
signal state_reg,next_state_reg : state;
signal write_address : std_logic_vector(W-1 downto 0):="00000000";
signal next_write_address : std_logic_vector(W-1 downto 0):="00000000";
begin
state_change : process(clk_50, main_reset)
begin
if (main_reset = '1') then
state_reg <= reset;
elsif (rising_edge(clk_50)) then
state_reg <= operation;
read_counter <= next_read_counter;
write_address<= next_write_address;
read_address <= next_read_address;
end if;
end process;
writecounter : process(clk_baud, main_reset,enable)
begin
if (main_reset='1') then
next_write_address <= "00000000";
Data_OUT <= "ZZZZZZZZ";
W_order <='0';
Write_Address_OUT <="ZZZZZZZZ";
elsif (rising_edge(clk_baud) and enable='1' ) then
W_order <='1';
Data_OUT <= in_data;
Write_Address_OUT <= write_address;
if (write_address = "11111111") then
next_write_address <= "00000000";
else
next_write_address <= write_address+1;
end if;
else
W_order <='0';
Write_Address_OUT <= "ZZZZZZZZ";
next_write_address <= write_address+1;
end if;
end process;
end Behavioral;
以上代码描述的是 RAM 控制器。
产生问题的部分是“elsif (rising_edge(clk_baud) and enable='1') then”。
错误:无法在 RAM_controler.vhd 中为“Write_Address_OUT”注册,因为它在时钟边沿之外没有保持其值
我不知道为什么那一点是错误的。
有人给我建议吗?
谢谢!
【问题讨论】:
-
应该是最后一个
else中的分配也与时钟的上升沿同步?您使用的是哪种合成工具? -
您的代码不是Minimal, Complete, and Verifiable example,缺少
W、read_address、next_read_address、read_counter和next_read_counter的声明。请注意,例如,您在rising_edge(clk_50) 上分配write_address,而next_write_address在rising_edge(clk_baud) 上分配。 Bill Lynch 指出,还有其他设计问题,例如在clk_baud, main_reset和enable的任何事件上,您也在分配Write_Address_OUT。 -
我正在使用 Quartus ii。实际上下面的答案对我有帮助。但我不知道为什么 last else 会像下面这样改变。
-
@Kim 如果您不明白答案,请在此下方发表评论,要求进一步解释。
-
只是要知道:要做一个代码的最小示例,只需删除所有不分配
Write_Address_OUT的分配。然后删除所有不再需要的端口。这样,该问题将对遇到相同问题的其他读者有用。
标签: vhdl