2013-05-24 2 views
0

나는 RS232 송신기 모듈을 스파르타의 VHDL에 쓰려고한다. 자일링스의 시뮬레이션에 따르면, 잘 작동하는 것처럼 보이지만, 디바이스에 배치하려고하면 간단히 작동하지 않는다. 나는 그것이 래치에 문제가 될 수 있다는 것을 알았지 만, 어떻게 든 그것들을 정확히 지적 할 수는 없다. 50Mhz 클럭을 사용하고 전송 비트율은 115200bps입니다.vhdl 래치의 RS232 송신기 모듈?

Xst:737 - Found 1-bit latch for signal <ready>. Latches may be generated from incomplete case or if statements. We do not recommend the use of latches in FPGA/CPLD designs, as they may lead to timing problems. 
Xst:737 - Found 1-bit latch for signal <state_0>. Latches may be generated from incomplete case or if statements. We do not recommend the use of latches in FPGA/CPLD designs, as they may lead to timing problems. 

내가 문,하지만 아무것도 작동하는 것 같다없는 경우 추가 추가하여 그들을 제거하려 : 합성 동안

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
USE ieee.std_logic_arith.all; -- Uncomment the following library declaration if using 
-- arithmetic functions with Signed or Unsigned values 
use IEEE.NUMERIC_STD.ALL; 

-- Uncomment the following library declaration if instantiating 
-- any Xilinx primitives in this code. 
--library UNISIM; 
--use UNISIM.VComponents.all; 

entity nadajnikRS is 
    Port (start : in STD_LOGIC; 
      reset : in STD_LOGIC; 
      clk : in STD_LOGIC; 
       DI : in STD_LOGIC_VECTOR(7 downto 0); 
      RS_TX : out STD_LOGIC; 
      busy : out STD_LOGIC); 
end nadajnikRS; 

architecture Behavioral of transRS is 
signal register : STD_LOGIC_VECTOR(8 downto 0) := (others => '1'); 
signal counter : INTEGER range 0 to 9 := 0; 
signal baud_clk : STD_LOGIC := '0'; 
signal ready : STD_LOGIC := '0'; 
type states is (working, free); 
signal state: states := free; 
signal baud_counter : INTEGER range 0 to 220 := 215; 
begin 

baud_clock: process (clk) 
begin 

if rising_edge(clk) then 
    if (ready = '1') then 
     if (baud_counter < 218) then 
      if (baud_counter = 217) then 
       baud_clk <= '1'; 
      end if; 
      baud_counter <= baud_counter+1; 
     else 
      baud_counter <= 0; 
      baud_clk <= '0'; 
     end if; 
    else 
     baud_counter <= 0; 
    end if; 

end if; 

end process baud_clock; 

shiftregister : process (baud_clk) 
begin 

    if rising_edge(baud_clk) then 
     if (state = free) then 
      RS_TX <= '0'; 
      register (7 downto 0) <= DI; 

     else 
      RS_TX <= register(0); 
      register <= '1' & register(8 downto 1); 
     end if; 


    end if; 
end process shiftregister; 

bitcounter : process (baud_clk) 
begin 
    if rising_edge(baud_clk) then 
     counter <= counter + 1; 
      if (counter = 10) then 
       counter <= 1; 
      end if; 
    end if; 
end process bitcounter; 

shiftstate: process (reset, counter, start) 
begin 
    if (reset = '1') then 
     ready <= '0'; 
    end if; 
    if (start = '1') then 
     ready <= '1'; 
     state <= free; 
    end if; 
    if (counter = 1) then 
     state <= working; 
    elsif (counter = 10) then 
     state <= free; 
    end if; 
end process; 

statemachine : process (state) 
begin 
    case state is 
    when working => busy <= '1'; 
    when free => busy <= '0' ; 
    end case; 

end process statemachine; 

end Behavioral; 

내가 두 래치 경고를 얻을 :

이 내 VHDL 코드입니다. 레지스터는 이후 나는, Ghaad

답변

1

감도 목록에 정확히 하나 개의 신호, CLK (물론 비동기 리셋을 사용하는 경우 가능하면 리셋 신호)이 있어야 레지스터를 설명하는 과정에게 어떤 도움을 감사합니다 단일 이벤트 즉, 클럭 에지에 민감합니다.

이렇게 프로세스 민감도 목록 baud_clock: process (clk,ready)shiftregister : process (baud_clk, state)은 이미 문제가 있음을 나타냅니다.

레지스터를 설명 할 때 항상 if(rising_edge(clk))이 설명 된 논리를 모두 포함하는지 확인하십시오. 간단한 등록 된 프로세스는 다음과 같아야합니다.

process(clk) begin 
    -- NO LOGIC HERE 
    if(rising_edge(clk)) then 
     if(reset='1') then 
      -- Synchronous reset logic here. 
     else 
      -- All other logic here. 
     end if; 
    end if; 
    -- NO LOGIC HERE 
end process; 
+0

내 baud_clock 및 shiftregister 프로세스의 민감도 목록을 단일 이벤트로 변경했지만 래치 문제를 수정하지 않았습니다. – Ghaad

+1

감도 목록을 변경해도 합성에는 아무런 영향이 없습니다. 이것은 더 깊은 문제를 나타내는 것일뿐입니다. 래치 문제를 해결하려면, 위의 템플릿을 따르도록 프로세스를 변경하십시오. 특히'if (rising_edge (clk)) ... end if;'구조의 앞이나 뒤에 선언문이 없는지 확인하십시오. – zennehoy

+0

그래도 여전히 도움이되지 않는다면, 코드를 치우고 빌드하려는 회로의 Register-Transfer-Level 블록 다이어그램을 그립니다.이것은 HDL-HDL을 배우는 것이 프로그래밍 언어가 아닌 하드웨어 * 기술 * 언어 일 때 매우 중요한 단계입니다! – zennehoy

1

'준비'를 수행하는 'shiftstate'프로세스를 살펴보십시오. '재설정'이 1이 아니고 '시작'이 1이 아닌 경우 어떻게 '준비'를 유도합니까? 당신은 그것을 말하지 않았으므로, 그러한 경우에는 '준비'되어 있습니다. 이것이 래치 (latch)가 의미하는 것입니다 : 프로세스는 '준비'가 무엇인지를 기억하고 이전과 동일하게 유지해야합니다. 따라서 코드는 메모리를 유추합니다. '준비'가 모든 지점에서 실행되는지 확인하십시오. 상단의 기본 할당으로 쉽게이 작업을 수행 할 수 있습니다.

귀하의 코드에는 여러 가지 다른 문제가 있습니다. 다른 누군가가 if 문 안에 상승 에지 탐지를해서는 안된다는 제안을 했습니까? 아니면 다른 사람 이었습니까? 돌아가서 다시 읽으십시오.

+0

if 문에 상승 에지가있는 문제가 이미 해결되었습니다. 하지만 난 completly 리셋이 1이 아니며 시작이 1이 아닌 경우에 의해 의미 이해하지 않습니다. 기본적으로, 준비가 0으로 설정됩니다. 나는 VHDL에 좀 새로운이지만, 다른 언어로 if 진술하지 않습니다 fullfiled, 그런 다음 변수가 변하지 않습니까, 아니면 singnals와 다른가요? 나는 단순히 <= ready;를 준비해야한다. 'shiftstate'과정의 시작에서? – Ghaad

+0

기본값 준비가되어 있지 않습니다. 프로세스 외부에서 초기 값을 지정했습니다. 이는 다른 점입니다. 예를 들어 리셋이 실패 할 때 프로세스 실행을 생각하십시오. ready에 할당 된 코드 경로가 없으므로 sim 또는 synth는 준비가 완료된 것을 기억하고 변경하지 않습니다. 그것에 대해 생각해보십시오 - 실제로 '변하지 않은'것은 무엇입니까? 하드웨어 디자인에서 메모리를 의미합니다. 'ready <= ready'는 아무런 차이를 만들지 않을 것입니다; 여전히 메모리가 필요합니다. 논리를 변경하거나 프로세스 시작시 준비를 0 또는 1로 설정하십시오. – EML

+0

프로세스 시작시 0 또는 1로 설정하면 도움이되지 않습니다. 시작/재설정은 짧은 신호이므로 대부분의 시간 동안 준비가 기본값으로 설정됩니다. 마지막 것을 기억해야합니다. 비록 프로그래밍 언어에서 변수로 사용되었지만 준비 할 때 = 1로 설정하면 기억 될 것입니다. 지금 내가 잘못 이해하고 VHDL이 값은 저장되지 않습니다. 나는 아직도이 문제를 어떻게 해결할 지 잘 모르지만, 당신의 도움에 감사드립니다. – Ghaad

0

모든 실행에 대해 프로그램이 변수에 해당하는 값을 알 수 있도록 if 문의 모든 가능성을 채우십시오. 문이 거의 항상 래치를 생성하지 않는 else 또는 elsif 옵션과 함께 사용되는 경우 ...

0

출력이 구동 된 출력에 값이 할당되지 않고 프로세스가 처음부터 끝까지 갈 수있을 때 래치가 발생할 수 있습니다. 즉, 프로세스에 조건부 명령문이 있고 결과가 이러한 조건부 명령문 내에서 구동되는 경우 결과가 절대 출력되지 않을 가능성이 큽니다. 이것을 피하려면 프로세스의 시작 부분에 동시 진술을 배치하여 산출물이 적어도 한 번 이상 설정되도록하는 것이 좋습니다. 이렇게하면 신디사이저에 래치가 생성되지 않게됩니다.