2017-03-10 1 views
-2

[편집] 나는 지금 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; 
+1

문제의 원인이되는 코드 종류의 최소 예를 게시하여 시작할 수도 있습니다. –

+1

질문 제목은 http://stackoverflow.com/questions/13954193/is-process-in-vhdl-reentrant/13956532#13956532를 참조하십시오. 질문 시체의 경우 Jeff가 말했듯이, 여러분이 정말로 묻고있는 것을 알기 위해 코드를보아야하므로, 그것을 단순화하십시오 [MCVE] –

+0

Brian의 링크 외에도 해결 된 유형의 신호를 할당하는 각 프로세스에는 드라이버가 있습니다 그 신호. 신호의 유효 값은 드라이버의 '해결 된'(http://stackoverflow.com/search?q=%5Bvhdl%5D+resolution) 값이며 'X'를 생성 할 수 있습니다. if 문은 std_ulogic 위치 값 (메타 값 포함)을 사용하여 불균형 또는 관계를 테스트하는 것처럼 들립니다. 디버거 앞에 '가상 하드웨어'문제 해결을위한 파형 디스플레이를 사용할 수 있습니다. MCVe를 크기에 맞게 요약하여 보여 주면 문제를 발견 할 수 있으며 독자는 추측 할 필요가 없습니다. – user1155120

답변

1

MCVe는 조금 더 있습니다.

문제는 테스트 벤치 또는 문제를 나타내는 파형이 없으면 확인할 수 없습니다.

그러나이 경우 문제는 코드에서 드라이버를 검색하여 찾을 수 있습니다. 이들의 위치 관계는 당신이 사용 주목

,이 협회의 오른쪽 수 있으며, 마지막 값은 DATA_OUT 요소 푹 출력입니다 : 할당 문을 찾아서 다른 드라이버를 찾아

--CHANNEL 0 REGISTERS-- 
DMACC0_SRCADD : Register32 port map (data_in,channel_enable(0),clr,clk,data_out(0)); 
DMACC0_DESTADD : Register32 port map (data_in,channel_enable(1),clr,clk,data_out(1)); 
DMACC0_LLI : Register32 port map (data_in,channel_enable(2),clr,clk,data_out(2)); 
DMACC0_CONTROL : Register32 port map (data_in,channel_enable(3),clr,clk,data_out(3)); 
DMACC0_CONFIG : Register32 port map (data_in,channel_enable(4),clr,clk,data_out(4)); 

우리 그들은 또한 로직 공정에 의해 구동하고 찾을 : 두 개의 드라이버가 있다는 것을 이해

data_out(0) <= x"00000000"; 
data_out(1) <= x"00000000"; 
data_out(2) <= x"00000000"; 
data_out(3) <= x"00000000"; 
data_out(4) <= x"00000000"; 

는 정교한 설계 모델이 신호에 의해 상호 연결 프로세스로 구성되어 있음을 이해에서 비롯됩니다.

'X'가 생성되는 방식은 여러 드라이버를 해결해야하기 때문입니다. 이것은 IEEE Std 1076-2008 14.7.2와 14.7.3에서 모델의 실행 세부 사항을 설명하는 복잡한 설명이다 (14.7).

data_out이 선언 된 테이블은 해결 된 테이블 인 std_logic_vector의 요소 유형을 가진 Arr40x32 유형으로 선언됩니다.

std_logic_vector의 각 요소를 분석하기위한 분석 함수는 std_logic_vector 패키지 본문에 있습니다.

가 확인에 사용하는 테이블은 : 드라이버 전류 값 분해 및 추가 드라이버 값으로 한 번에 두 촬영되는 std_logic_value의 각 요소에 대해 STD_LOGIC

------------------------------------------------------------------- 
-- resolution function 
------------------------------------------------------------------- 
CONSTANT resolution_table : stdlogic_table := (
--  --------------------------------------------------------- 
--  | U X 0 1 Z W L H -  | | 
--  --------------------------------------------------------- 
     ('U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U'), -- | U | 
     ('U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'), -- | X | 
     ('U', 'X', '0', 'X', '0', '0', '0', '0', 'X'), -- | 0 | 
     ('U', 'X', 'X', '1', '1', '1', '1', '1', 'X'), -- | 1 | 
     ('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X'), -- | Z | 
     ('U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X'), -- | W | 
     ('U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X'), -- | L | 
     ('U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X'), -- | H | 
     ('U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X') -- | - | 
    ); 

. 두 개의 입력은 위의 표에서 행과 열을 선택하는 데 사용되며 두 신호의 해결 된 값을 알려줍니다. 이 경우 모든 std_logic_vector 값의 std_logic 요소에 대한 모든 드라이버에 대해 수행됩니다.

래치 (논리 프로세스)가있는 '0'에 모두 할당 된 드라이버 중 하나입니다. 다른 드라이버는 특정 Register32의 출력입니다. 한 드라이버가 '0'을 출력하고 다른 드라이버 출력이 '32'레지스터에 '1'을 입력하면 'X'가 표시됩니다.

두 드라이버를 함께 단락시키는 대신 특정 시간에 data_out 값을 0으로 게이트하는 것이 하드웨어에서 실현 될 수있는 것을 설명했습니다.

MCVe가없고 작동중인 디자인을 보게되면 적절한 수정을 제안하지 못할 수 있습니다.

+0

좋아, 이제는 내 문제를 설명 할 수있는 최상의 MCVe를 작성하려고하지만 오류가 발생한 위치와 코드가 너무 복잡하고 긴 문제를 확인하기 위해 직면하고 있습니다. 그러나 명시된 문제를 사용하십시오 : "래치 (논리 프로세스)가있는 '0'에 모두 할당 된 드라이버 중 하나입니다. 다른 드라이버는 특정 Register32의 출력입니다. 한 드라이버가 출력되면 '0'이고 다른 드라이버 출력은 '32'레지스터에 '1'을 입력하면 'X'가 표시됩니다. " 이 문구를 입력하는 사례가 틀린 경우에도이 드라이버가 서로 방해합니까? –

+0

일단 드라이버가 값을 구동하면 드라이버가 연결이 끊어 지거나 값이 업데이트되지 않는 한 값이 사용됩니다. 해결 된 유형의 경우 그물에있는 모든 드라이버가 제공됩니다. 해결 된 유형이 아니라면 드라이버가 두 개 이상이면 하나의 프로세스에서만 신호를 보내라는 오류 메시지가 표시됩니다. 디자인 문제가 있습니다. – user1155120

관련 문제