2017-05-01 52 views
-3

저는 50MHz 클럭을 FPGA에서 사용하고 5 초 타이머를 만들려고합니다. cnt_t에 도달하면 5 x 50MHz (x "0EE6B280"-> 250,000,000)가됩니다. 그런 다음 time_tick_32를 1로 설정하고 cnt_t를 < = x "00000000";으로 만듭니다. 아래의 코드는 15 초 VHDL 타이머

signal cnt_t : STD_LOGIC_VECTOR(31 DOWNTO 0) := x"00000000"; 
signal time_tick : STD_LOGIC:= '0' ; 
signal time_tick_32 : STD_LOGIC_VECTOR(31 DOWNTO 0):= x"00000000"; 


process (clk_50) IS 
    begin 
     if falling_edge(clk_50) then 
     cnt_t <= cnt_t + '1'; 
     end if; 
    if (cnt_t = x"0EE6B280") then --if 5 seconds 
     time_tick <= '1'; 
     cnt_t <= x"00000000"; 
     time_tick_32(0)<=time_tick; 
    else 
     time_tick <= '0'; 
     time_tick_32(0)<=time_tick; 
    end if; 

end process; 
+0

확실하지,하지만 당신은 당신이 당신의 숫자 조건 내부 문자열 비교 하시겠습니까? – Gogol

+1

@Gogol'x "...."는 16 진수 비트 스트링 리터럴입니다. 따라서 (문자) 문자열과의 비교는 아닙니다. – Paebbels

+1

전체 코드를 알려주십시오. 여기에 몇 가지 힌트가 있습니다 : 1.'cnt_t'의 타입을'unsigned' 또는'natural'으로 변경하십시오. 2. 32 비트는 필요 없습니다. 3. 매직 넘버 => 정수 값을 사용하지 마라. (부호없는 타입은 정수와 비교 될 수 있습니다.) – Paebbels

답변

1

한번에 얻을 수 없다 time_tick_32 작동하지 않았다 :이 언어에 대한

signal cnt_t : STD_LOGIC_VECTOR(31 DOWNTO 0) := x"00000000"; 
signal time_tick : STD_LOGIC:= '0' ; 
signal time_tick_32 : STD_LOGIC_VECTOR(31 DOWNTO 0):= x"00000000"; 


-- I assume you begin your architecture somewhere 
-- Can make the following a concurrent statement 
-- (unless it is some kind of shift reg assigned in a diff process... 
-- then you will get multiple driver issues) 
time_tick_32(0) <= time_tick; 

process (clk_50) IS 
begin 
    if rising_edge(clk_50) then -- Changed to rising_edge; 
           -- Any particular reason you are using falling_edge? 
     if (cnt_t = x"0EE6B280") then --if 5 seconds 
      time_tick <= '1'; 
      cnt_t <= x"00000000"; 
     else 
      time_tick <= '0'; 
      cnt_t <= cnt_t + '1'; 
     end if; 
    end if; 
end process; 
+0

프로세스 외부 (아키텍처 블록 내)에 신호를 할당하여 _concurrent_ 할당을 처리 할 수 ​​있습니다. 'time_tick_32 '를 사용하여 무엇을 사용하고 있는지 판별하기는 어렵습니다. 당신이 다른 곳에 그것을 할당하지 않는 한, 당신은 잘되어야합니다. – gsm