2017-10-18 14 views
0

저는 계산 모듈을 구현하려고합니다. 내 기본 설정 : 신호 생성기에 연결된 IO 포트에 연결된 2 개의 BNC 케이블과 판독을 위해 USB/UART를 통해 PC에 연결되는 FPGA (자일링스 Artix-35T가있는 Digilent의 Arty). 내 신호 발생기는 1 Hz에서 TTL 신호를 생성합니다.다른 채널의 카운팅이 분기 및 점프

이제 채널 1, 채널 2, 채널 1 및 2의 이벤트 수를 계산하고 싶습니다. 기본 원리는 작동하지만 채널 1과 채널 2는 동일한 입력 (BNC-T 커넥터를 통해). 또한 때로는 출력 채널 중 하나가 어느 방향 으로든 점프합니다 (그림 참조). counting 보라색 채널 ("채널 1")은 녹색 ("채널 2")과 다른 기울기를 갖습니다. 또한 우연의 일치는 여기서 두 가지 작은 손실 점프를 만듭니다. 우연의 일치뿐만 아니라 '하나의 이벤트를'-

reg [15:0] coinciInt [(numCoincidences -1):0]; // internally store events 
always @(posedge clk or posedge reset) // every time the clock rises... 
begin 
    signalDelay <= signal;    // delayed signal for not counting the same event twice 

    if(reset)        // reset 
    begin 
     for(i=0;i<numCoincidences;i=i+1) 
      coinciInt[i] <= 16'b0; 
    end 
    else         // No reset 
    begin 
     for(i=1;i<numCoincidences;i=i+1) // loop through all coincidence possibilities: 
     begin 
      if(((signal & i) == i) && ((signalDelay & i) != i)) // only if signal give coincidence, but did not give before, it's a coincidence 
      begin       // "(signal & i) == i" means that "signal" is checked if bitmask of "i" is contained: 
              // ((0011 & 0010) == 0010) is true, since 0011 & 0010 = 0010 == 0010 
       coinciInt[i] <= coinciInt[i] + 1'b1; // the i-th coincidence triggered, store it 
      end 
     end 
    end 
end // end of always 

assign coinci = coinciInt; // the output variable is called coinci, so assign to this one 

모든 이벤트가 등록 coinci에 유의하시기 바랍니다처럼

내 순차적 인 계산 코드가 보인다. 이상적으로, coinci [1]는 채널 1,2,4,8, ..., 2로 레이블이 붙어 있기 때문에 채널 1, 일치 2, 일치 2 [3], 일치 1 [2]^n과 우연의 일치에 의해. coinci [0]은 어떤 종류의 체크섬에 사용되지만, 지금은 오프 주제입니다.

누락 된 계산에 대한 아이디어가 있습니까? 다른 경사면을 위해?

당신에게 편집 1

@ 브라이언 마 그누가 메타 안정성 문제로 지적

대단히 감사합니다. 다중 버퍼 입력을 사용하면 채널을 분기하는 문제가 해결되었습니다. 그건 잘 작동합니다. 이 이유를 완전히 이해하지는 못했지만 지금까지 우연의 일치 채널에서 어떤 점프도 보지 못했습니다. 당신은 아마 저에게 많은 시간을 구합니다, 감사합니다!

+0

다행 당신을 위해 다행. 짧은 답변을 드려서 죄송합니다. https://en.wikipedia.org/wiki/Flip-flop_(electronics)#Timing_considerations에는 조금 더 많은 정보가 있습니다. 기본적으로 싱크로 나이저가 없으면 입력 신호가 나오는 첫 번째 FF의 설정/홀드 요구 사항을 위반하는 경우가 있습니다. 이 때 플럽이가는 상태 (0/1)는 결정적이지 않습니다. 싱크로 나이 저는 '그 행동을'포함하고 있으며 카운터 로직을 오염시키지 않습니다. 또 다른 google'able 구는 'clock domain crossing'이 될 것입니다. 행운을 빕니다! –

답변

1

메타 안정성 문제가 의심됩니다. ch1/ch2에 들어오는 펄스가 사용중인 시스템 클럭과 동기화되지 않은 것 같습니다. See here.

이 때문에 예상치 못한 동작을 일으킬 수있는 'mid-stride'카운터 업데이트를 잡기도합니다.

이 문제를 해결하려면 나머지 논리 회로에 입력하기 전에 입력을 두 번 겹쳐 쓸 수 있습니다 (이중 순위 동기화 장치라고 함). 일반적으로 멀티 비트 동기화는 조금 더 조심스럽게 처리해야하지만, 각 비트를 독립적으로 처리 할 수 ​​있습니다.