2013-03-18 1 views
1

나는이 답변을 찾고 있지만 아무 소용이 시도했다. 내 코드를 다시 합성 할 때 문제가 생겼고 클럭 문제로 인한 것으로 의심된다.특정 주파수 Verilog에서 핀 강제

DCM을 사용하여 외부 크리스털 발진기에 25MHz ~ 50MHz를 곱합니다. 그러나이 툴은 외부의 물리적 구성 요소이기 때문에 수정 오실레이터가 실제로 어떤 주파수인지 알 수 없을 것이라고 생각합니다. 내 코드는 다음과 같습니다.

//since our crystal oscillator is only 25Mhz, we use a DCM to multiply it by two since the desired is 50Mhz 
DCM #(
    .CLKFX_DIVIDE (2), 
    .CLKFX_MULTIPLY (4) 
) dcm_master (
    .CLKFB (CLK_FB), 
    .CLKIN (CLK_crystal), 
    .RST  (DcmReset),  
    .CLK0  (MasterClk0Unbuf), 
    .CLK90 (), 
    .CLK180 (), 
    .CLK270 (), 
    .CLK2X (), 
    .CLK2X180(),  
    .CLKFX (MasterClkFxUnBuf), 
    .CLKFX180(), 
    .CLKDV (), 
    .LOCKED (DcmLocked), 
    .STATUS (), 
    .PSCLK (1'b0), 
    .PSEN  (1'b0), 
    .PSINCDEC (1'b0), 
    .PSDONE ()  
); 

//we provide feedback to the DCM's phase input (possibly not neccessary) 
BUFG bufg_master_dcm_clk_0 (.I(MasterClk0Unbuf), .O(CLK_FB)); 
BUFG bufg_master_dcm_clk_fx (.I(MasterClkFxUnBuf), .O(CLK_FX)); 

//code taken from xilinx. We toggle using a bufgmux between the onboard and external clock 
// BUFGMUX: Global Clock Buffer 2-to-1 MUX 
// Spartan-3 
// Xilinx HDL Libraries Guide, version 13.2 
BUFGMUX BUFGMUX_inst (
.O(CLK), // Clock MUX output 
.I0(CLK_FX), // Clock0 input 
.I1(CLK_local), // Clock1 input 
.S(sw[6]) // Clock select input 
); 

ucf의이 코드는 툴이 내 DCM의 출력을 50MHz로 인식하게합니까?

PIN "bufg_master_dcm_clk_fx.O" TNM_NET = CLK50; 
TIMESPEC TS_CLKBuf = PERIOD "CLK50" 100 MHz HIGH 50%; 

또한 BUFG를 올바르게 사용하고 있습니까? 자일링스는 IBUFG를 사용하여 외부 클럭을 DCM에 연결해야한다고 말하면서 BUFG가 칩의 절반 만 처리 할 수 ​​있다고 말하는 오류가 발생한다 (문제가 있다고 생각된다).

덕분에,

나단

+0

'always @ (posedge CLK 또는 negedge CLK)'를 사용할 수없는 이유가 있습니까? – N8TRO

+0

@ Nathan G - 그렇게하려고하면 오류가 발생합니다 - "레지스터 또는 래치를 설명하는 데 사용하는 설명 스타일이 현재 소프트웨어 릴리스에서 지원되지 않습니다". 두 클럭 에지에서 플립 플롭을 어떻게 구동하는지 쉽게 시각화 할 수 없습니다. –

+0

Verilog 구현보다는 합성을위한 클록 제약 적용에 관한 질문입니까? – Morgan

답변

0

는 내가 처음이 테스트 좋았을 것이다. DCM 중 하나를 사용하는 FPGA의 Spartan-3 제품군의 경우. ISE가 생성하는 템플릿입니다.

전용 CLK2X가 있습니다.

또한 사용자 설명서를 기반으로합니다. .CLKFB는 BUFG 소스에 의해 구동되어야합니다.

 wire i_FeedBack; 
    wire o_FeedBack; 

    BUFG clkFBBuf(
      .I(i_FeedBack), 
      .O(o_FeedBack) 
    ); 


    DCM #(
[...] 
    .CLKFX_DIVIDE(1), // Can be any integer from 1 to 32 
    .CLKFX_MULTIPLY(2), // Can be any integer from 2 to 32 
[..] 

) DCM_inst (
     .CLK0(i_FeedBack),  // 0 degree DCM CLK output 
     .CLK2X(CLK2X), // 2X DCM CLK output 
     [...] 
     .CLKFX(CLKFX), // DCM CLK synthesis out (M/D) 
     .CLKFB(o_FeedBack), // DCM clock feedback 
     .CLKIN(clk), // Clock input (from IBUFG, BUFG or DCM) 
     [...] 
    ); 
1

시계 제한이 꺼져 있다고 생각합니다. DCM에 대한 입력을 제한해야합니다. DCM은 출력물로 수행 할 작업을 알고 있습니다. 여기에 내가 무엇을 쓸 것인가 :

NET clk_in TNM_NET = tnm_clk_in; 
TIMESPEC TS_clk_in = PERIOD tnm_clk_in 40ns; 

여기서 clk_in은 크리스탈 (귀하의 경우에는 CLK_crystal)입니다. 크리스탈이 장치의 클록 핀에 연결되어 있는지 확인하십시오.