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