Verilog : 입력 신호를 한 클럭 주기로 지연시키는 방법은 무엇입니까?

user3330840

입력 신호를 한 번의 완전한 클럭 주기로 지연시키고 싶습니다.
기본적으로 시계의 위치에서 신호를 변경하려는 아래 코드가 있습니다.
그러나 테스트 벤치는 항상 1주기 지연되는 것은 아니라는 것을 보여줍니다.
어떤 경우에는 입력 신호가 변경되는 동시에 변경됩니다.

이런 종류의 문제를 해결할 방법이 있습니까?

module delay_one_cycle(
  input clk,
  input[3:0] original_signal,
  output reg[3:0] delayed_signal
);

  always @(posedge clk) begin
    delayed_signal <= original_signal;
  end


endmodule

module delay_one_cycle_tb();
  reg clk;
  reg[3:0] original_signal;  
  wire[3:0] delayed_signal;

  delay_one_cycle doc_inst (clk, original_signal, delayed_signal);  

  // Initial setup
  initial begin  
    clk                 = 0;

    original_signal     = 4'd9;
    #5 original_signal  = 4'd10;
    #5 original_signal  = 4'd11;    
    #4 original_signal  = 4'd12;
    #3 original_signal  = 4'd13;

    // finish the simulation
    #5 $finish;
  end  

  // clock
  always begin
    #1 clk = !clk;
  end
endmodule

다음은 파형입니다. 여기에 이미지 설명 입력파형은 예를 들어 입력 신호가 클럭 에지에서 1010으로 변경 될 때 출력도 동시에 변경되는 것을 보여줍니다.
delayed_signal은 실제로 다음 주기로 지연되지 않습니다!

e19293001

이 질문은 귀하의 질문과 매우 유사합니다. 왜 D Flip Flop이 시계의 양의 가장자리를 기다리지 않습니까?

경쟁 조건을 피하기 위해이 규칙을 시도 할 수 있습니다.

@(posedge clk);

블로킹 할당을 사용하여 RTL 코드에 입력 신호를 설정하지 않도록하십시오. @Morten Zilmer가 제안하는 대신 비 차단 할당을 사용하십시오.

테스트 벤치는 어떻게 든 다음과 같이 보일 것입니다.

module delay_one_cycle(
  input clk,
  input[3:0] original_signal,
  output reg[3:0] delayed_signal
);

  always @(posedge clk) begin
    delayed_signal <= original_signal;
  end


endmodule

module delay_one_cycle_tb();
  reg clk;
  reg[3:0] original_signal;  
  wire[3:0] delayed_signal;

  delay_one_cycle doc_inst (clk, original_signal, delayed_signal);  

  // Initial setup
  initial begin  

    original_signal     <= 4'd9;
    repeat (5) @(posedge clk);
    original_signal  <= 4'd10;
    repeat (5) @(posedge clk);
    original_signal  <= 4'd11;
    repeat (4) @(posedge clk);
    original_signal  <= 4'd12;
    repeat (3) @(posedge clk);
    original_signal  <= 4'd13;

    // finish the simulation
   repeat (5) @(posedge clk);
   $finish;
  end  

  initial begin
    clk                 = 0;
    forever begin
       #1 clk = !clk;
    end
  end 
endmodule

도움이되기를 바랍니다.

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

블루투스 장치의 수신 신호 강도 표시기 (RSSI)를 얻는 방법은 무엇입니까?

동일한 클래스에서 두 번째로 가까운 요소를 얻는 방법은 무엇입니까?

레이블, 입력 및 이미지를 한 줄에 표시하는 방법은 무엇입니까?

날짜의 주에 대한 YEAR를 얻는 방법은 무엇입니까?

버튼 클릭에 한 번 선택 윤곽주기를 만드는 방법은 무엇입니까?

사용자 입력의 주기적 처리를 구현하는 방법은 무엇입니까?

Verilog : 레지스터를 사용한 1 클럭 사이클 지연

mqtt 클라이언트에 대한 연결 해제 시간을 늘리기 위해 mosquitto 브로커를 구성하는 방법은 무엇입니까?

jquery에서 클릭 한 li와 동일한 li 클래스를 표시하는 방법은 무엇입니까?

RecyclerViewAdapter에서 클릭 한 마지막 위치보기를 검색하는 방법은 무엇입니까?

파이프 라인 프로세서에서 클럭 레지스터의 목적은 무엇입니까

불변 벡터를 한 줄로 연결하는 방법은 무엇입니까?

동일한 ImageDataGenerator이지만 다른 class_indices-생성기 내에서 클래스를 다시 매핑하는 방법은 무엇입니까?

PHP의 연관 배열에서 복잡한 객체를 키로 사용하는 방법은 무엇입니까?

한 번의 호출로 여러 템플릿 함수를 호출하는 방법은 무엇입니까?

vscode tmllanguage에 대한 주석 바로 가기를 활성화하는 방법은 무엇입니까?

예측 패키지를 사용하여 ccf 플롯에서 중요한 신호 / 지연 목록을 얻는 방법은 무엇입니까?

Bootstrap Javascript를 지연로드 한 후 initCallback 함수를 트리거하는 방법은 무엇입니까?

매트 버튼 래퍼 대신 클릭 한 매트 버튼의 ID를 얻는 방법은 무엇입니까?

Qt : 다른 클래스의 정적 신호를 슬롯에 연결하는 방법은 무엇입니까?

사용자가 입력을 중지 할 때까지 데이터 가져 오기를 지연 / 시작 / 디 바운스하는 방법은 무엇입니까?

중첩 목록에서 루프 (무한) 기호를 제거하는 방법은 무엇입니까?

입력 및 출력 바인딩으로 Azure Functions 2.0 CosmosDB를 연결하는 방법은 무엇입니까?

반응 선택 입력에서 선택한 기호를 제거하는 방법은 무엇입니까?

게시 방법에 대한 기본 입력 값을 정의하는 방법은 무엇입니까?

입력을 기반으로 한 동시 작업 수를 선택하는 코드를 압축하는 방법은 무엇입니까?

주제를 나타내는 한두 단어를 자동으로 생성하는 방법은 무엇입니까?

실질적으로 동일한 하위 클래스를 만드는 두 가지 방법은 무엇입니까?

새 크롬 인스턴스를 여는 대신 로그인 한 Slenium에서 클래스를 실행하는 방법은 무엇입니까?