2015-09-28 4 views
0

Я не могу обновить reg_1 и reg_2 векторы, разделив reg_mem? Это мой код в VHDL, который я написал в MODELSIM: В другой программе я попытался разделить другой вектор на две части и сохранить их в двух разных Vectors.It работал отлично. Но такой же синтаксис не работает в этом кодеНе удалось разбить вектор в VHDL

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity Register_unit is 
port (
    reg_read : in std_logic; 
    reg_write : in std_logic; 
    reg_mem : inout std_logic_vector(3 downto 0); 
    reg_start : inout std_logic_vector(3 downto 0); 
    reg_end : inout std_logic_vector(3 downto 0); 
    reg_write_comp : out std_logic; 
    reg_read_comp : out std_logic; 
    reg_1 : inout std_logic_vector(1 downto 0); 
    reg_2 : inout std_logic_vector(1 downto 0)); 
end Register_unit; 

architecture Register_unit_arch of Register_unit is 
begin 

    process (reg_read,reg_write) 
    begin 
    if (reg_read = '1' and reg_write = '0') then 
     reg_end <= reg_mem; 
     reg_read_comp <= '1'; 
    elsif (reg_write = '1' and reg_read = '0') then 
     reg_mem <= reg_start; 
     reg_write_comp <= '1'; 
    end if; 
    reg_1 <= reg_mem(1 downto 0); --reg_1 is not getting updated 
    reg_2 <= reg_mem(3 downto 2); --reg2 is not getting updated 
    end process; 

end Register_unit_arch; 
+0

Чувствительность список ошибок в процессе асинхронного. Одно исправление: переместите разделение вне процесса. Также читайте http://stackoverflow.com/questions/13954193/is-process-in-vhdl-reentrant/13956532#13956532 Также обратите внимание, что нет способа сбросить сигналы 'reg _ * _ comp'. –

ответ

0

reg_1 и reg_2 обновляется, но они обновлены до предыдущего значения reg_mem. Эта линия;

reg_mem <= reg_start; 

не действует до конца процесса. Вы делаете назначение reg_1 и reg_2 до того, как reg_mem имеет новое значение!

VHDL не работает сверху вниз, как язык программирования, даже если вы находитесь в process.

В вашем случае вы должны либо использовать переменную (*), либо напрямую назначать ее с reg_start;

reg_1 <= reg_start(1 downto 0); 
reg_2 <= reg_start(3 downto 2); 

(*) переменные немедленно назначается в процессе, вы можете использовать их похожи на переменном языке программирования

+0

@HeyYOThanks очень я понял, где я ошибся. Просто изменил переменные процесса и все правильно работает – saideep1808