2012-06-21 7 views
2

ISE 13.4를 사용하여 Virtex-5에서 블록 RAM에 저장하고자하는 벡터 배열이 있습니다. 1 BRAM에 맞아야하는 32Kb이지만 모두 로직에 저장됩니다. 내 시스템은 AMBA APB 버스를 사용하므로 선택 라인과 활성화 라인을 확인합니다. 왜이 코드가 BRAM을 유추하지 않는지 이해해주세요. 참고 :이 예제는 이해하기 쉽고 다른 코드를 도와 주어야하는 더미 예제입니다. 이 VHDL이 XST에서 BRAM을 유추하지 않는 이유는 무엇입니까?

architecture Behavioral of top is 
type memory_array is array (63 downto 0) of std_logic_vector(31 downto 0); 
signal memory : memory_array; 

attribute ram_style: string; 
attribute ram_style of memory : signal is "block"; 

begin 

process(Clk) 
begin 
    if(rising_edge(Clk)) then 
     if(Sel and Wr_en and Enable) = '1' then 
      memory(to_integer(Paddr(5 downto 0))) <= Data_in; 
     elsif(Sel and not Wr_en and Enable) = '1' then 
      Data_out <= memory(to_integer(Paddr(5 downto 0))); 
     end if; 
    end if; 
end process; 

end Behavioral; 

나는 block로 배열의 ram_style를 선언하지만, XST 보고서는 말한다 : WARNING:Xst:3211 - Cannot use block RAM resources for signal <Mram_memory>. Please check that the RAM contents is read synchronously.

문제가 read_enable 상태에 있다고 표시하지만, 버텍스 5 사용자 설명서가 것처럼 들리게 BRAM 하드 블록상의 enablewrite_enable. 나는 항상 출력을 이끌어 낼 수 있었지만, 나는 그것을 원하지 않는다. 그리고 그것은 힘을 낭비 할 것이다. 다른 아이디어?

답변

1

나는 다른 많은 시도 조합은 여기에 내가 일하는 유일한 사람이다 :

en_BRAM <= Sel and Enable; 

process(Clk) 
begin 
    if(rising_edge(Clk)) then  
     if(en_BRAM = '1')then 
       if(Wr_en = '1') then 
        icap_memory(to_integer(Paddr(5 downto 0))) <= Data_in; 
       else 
        Data_out <= icap_memory(to_integer(Paddr(5 downto 0)));   
       end if; 
     end if; 
    end if; 
end process; 

그래서 나는 전체 RAM에있을 필요가 있고 그것은 단지 하나의 신호 일 수 있다고 생각한다. 그런 다음 쓰기 활성화 또한 1 신호일 수 있으며 읽기는 else 문 (if/elsif 아님)이어야합니다. 이것은 Windows 7 64 비트에서 ISE 13.3의 XST에 따라 BRAM을 인스턴스화합니다.

1

기기의 BRAM 블록에 적절한 매크로를 사용 하시겠습니까? 나는 바보가 아닌 합성 도구에 의존하는 것보다 훨씬 잘 작동한다는 것을 알았다.

+0

저는 BRAM 매크로에 익숙하지 않습니다. 새 BRAM 구성 요소를 인스턴스화하고 포트를 디자인에 연결해야합니까? – Stuart

+0

정확하게 작동합니다. – timos

+0

어디에서 템플릿 예제를 찾을 수 있습니까? – Stuart

2

논리가 장치의 BRAM 작동 방식과 일치하지 않을 수 있습니다 (장치에 따라 다양한 제한이 있습니다). 일반적으로 data_out는 RAM이 그냥 "작성하지 않을 경우"아니, 사용할 때마다 클럭 사이클에 업데이트됩니다 -이 시도 : 나는 DATA_OUT 할당을 이동

process(Clk) 
begin 
    if(rising_edge(Clk)) then 
     if(Sel and Enable) = '1' then 
      Data_out <= memory(to_integer(Paddr(5 downto 0))); 
      if wr_en = '1' then 
       memory(to_integer(Paddr(5 downto 0))) <= Data_in; 
      end if; 
     end if; 
    end if; 
end process; 

는 "위쪽"분명히 그것은를 얻을 수 있는지 확인하는 "old"값 - 다른 스타일도 설정할 수 있지만 BRAM의 기본 동작입니다.

또는 도구가 하나의 if 문에서 selenablewrite 모두에 의해 혼동 할 수있다 -이 BRAM을 추론 할 때 주로 "템플릿 매칭"보다는 "기능의 일치"이기 때문이다. 간단하게 "enable if"와 "write if"(위에서와 같이)를 분리하는 동안 나머지 기능들은 그대로 유지하면서 신디사이저가 필요한 것을 수행하기에 충분합니다.

당신이 당신이 문서에 램을 추론에 대한 모든 것을 읽을 수 있습니다 자일링스의 XST를 사용하는 경우 (내 XST 사용자 가이드의 이후 페이지 (204) - 장은 "RAM HDL이 기술을 코딩"이라고합니다)은