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控制器。VHDL - 时钟边缘外的编码错误
使问题的部分是“elsif(rising_edge(clk_baud)和enable ='1')then”。
错误:不能老是为“Write_Address_OUT”间寄存器在RAM_controler.vhd因为它没有保持时钟边沿
我不`吨知道为什么这一点是错误以外的价值。
有人向我提出建议吗?
谢谢!
最后一个'else'中的分配应该与时钟的上升沿同步吗?你正在使用哪个综合工具? –
您的代码不是[最小,完整和可验证的示例](http://stackoverflow.com/help/mcve),对'W','read_address','next_read_address','read_counter'和'next_read_counter'的声明'丢失。请注意,例如,您正在使用在rising_edge(clk_baud)上指定的'next_write_address'在rising_edge(clk_50)上分配'write_address'。还有其他一些设计问题,比如Bill Lynch指出,例如在任何'clk_baud,main_reset'和'enable'事件中你都会执行'Write_Address_OUT'的分配。 – user1155120
我正在使用Quartus II。 其实下面的答案对我很有帮助。 但我不知道为什么最后的其他改变如下。 – Kim