[편집] 나는 지금 DMA 컨트롤러 모델에서 일하고 있는데, 같은 시계와 병렬로 작동하는 3 개의 프로세스를 작성하고있다. 두 개의 주요 프로세스가 동일한 레지스터에 액세스하지만 나는 절대로 그렇게하지 않을 것이라고 확신했다. 충돌 "특정"값을 확인하기 위해 "경우"를 사용하여 "clr"신호를 사용하여 레지스터의 데이터를 지우는 첫 번째 경우 여기서 문제는 값이 항상 "xxxx"이고 두 번째 프로세스의 If 조건입니다. 항상 true [편집 : if 'x'는 if 조건이 true인지 false인지를 결정하는 데 사용되며 파형의 출력은 '1'입니다. 이는이 조건이 data_out에 대해 충돌하는 조건이 아니라는 것을 의미합니다. data_out은 여전히 X입니다. 그래서 충돌은 무엇입니까?프로세스가 정확히 vhdl에서 병렬로 작동합니까? 2 개의 프로세스가 충돌 할 수있는 이유는 무엇입니까?
library ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
USE ieee.numeric_std.ALL;
ENTITY DMAC_CHANNEL_REG_BANK IS
port(
clr : IN STD_LOGIC; -- async. clear.
clk : IN STD_LOGIC; -- clock.
-- Slave Signals
HRData : OUT STD_LOGIC_vector(31 downto 0); -- Data to be READ by the AHB SLAVE INTERFACE
HWData : in std_logic_vector(31 DOWNTO 0); -- data to be written in the REGISTER from the AHB SLAVE INTERFACE
HAddr : in std_logic_vector(9 downto 0); -- Address for the Register to be programmed -- from AHB SLAVE INTERFACE
);
END DMAC_CHANNEL_REG_BANK;
ARCHITECTURE description OF DMAC_CHANNEL_REG_BANK IS
Component Register32 is
PORT(
input : IN STD_LOGIC_VECTOR(31 DOWNTO 0); -- input.
enable : IN STD_LOGIC; -- Write/enable.
clr : IN STD_LOGIC; -- async. clear.
clk : IN STD_LOGIC; -- clock.
output : OUT STD_LOGIC_vector(31 downto 0)
); -- end of port
end component;
type Arr40x32 is array (39 downto 0) of std_logic_vector(31 downto 0);
signal data_out : Arr40x32;
signal data_in : STD_LOGIC_vector(31 downto 0);
type State_type_logic is (IDLELOGIC);
signal PresentStateLOGIC, NextStateLOGIC : State_type_logic := IDLELOGIC;
signal C0Config: std_logic_vector(31 downto 0);
signal x : std_logic := '0';
BEGIN
--CHANNEL 0 REGISTERS--
DMACC0_SRCADD : Register32 port map (data_in,channel_enable(0),clr,clk,data_out(0));
DMACC0_Config : Register32 port map (data_in,channel_enable(1),clr,clk,data_out(1));
Logic : process (clk,PresentStateLogic,DMAC_ENABLE)
begin
case PresentStateLogic is
when IDLELOGIC =>
C0Config <= data_out(1);
--- Cleaning data of the inactive channels
if C0CONFIG(0) = '0' and C0CONFIG(17) = '0' and C0CONFIG(18) = '0' and PresentStateREG /= WRITE1 and clr /= '0' then -- checking for Enable , Halt , and Active
data_out(0) <= x"00000000";
else
x <= '1';
end if;
end case;
end process Logic ;
process (clk)
begin
if (rising_edge(clk)) then
PresentStateREG <= NextStateREG;
PresentStateLogic <= NextStateLogic;
end if;
end process;
END description;
문제의 원인이되는 코드 종류의 최소 예를 게시하여 시작할 수도 있습니다. –
질문 제목은 http://stackoverflow.com/questions/13954193/is-process-in-vhdl-reentrant/13956532#13956532를 참조하십시오. 질문 시체의 경우 Jeff가 말했듯이, 여러분이 정말로 묻고있는 것을 알기 위해 코드를보아야하므로, 그것을 단순화하십시오 [MCVE] –
Brian의 링크 외에도 해결 된 유형의 신호를 할당하는 각 프로세스에는 드라이버가 있습니다 그 신호. 신호의 유효 값은 드라이버의 '해결 된'(http://stackoverflow.com/search?q=%5Bvhdl%5D+resolution) 값이며 'X'를 생성 할 수 있습니다. if 문은 std_ulogic 위치 값 (메타 값 포함)을 사용하여 불균형 또는 관계를 테스트하는 것처럼 들립니다. 디버거 앞에 '가상 하드웨어'문제 해결을위한 파형 디스플레이를 사용할 수 있습니다. MCVe를 크기에 맞게 요약하여 보여 주면 문제를 발견 할 수 있으며 독자는 추측 할 필요가 없습니다. – user1155120