2 augusti, 2019 Incopia

verilog fifo 예제

이 모듈(Verilog 및 VHDL 모두)은 가변 속도 데이터 전송을 버퍼링하거나 디지털 통신 및 신호 처리 알고리즘에 사용되는 데이터를 보류/버퍼링하는 데 일반적으로 사용되는 선착장(FIFO) 버퍼 모듈입니다. 예를 들어 FIFO 모듈은 FIR 필터에서 원형 버퍼 또는 지연 라인으로 사용될 수 있습니다. 또한 필요한 논리를 설명하기 위해 이 FIFO의 소프트웨어 예제부터 시작하여 디지털 로직(예: Verilog)으로 변환합니다. 안녕! 코드를 주셔서 감사합니다, 나는 verilog 설명의 새로운 이기 때문에 나를 위해 정말 도움이됩니다. 나는 어떻게 빈 신호의 내용을 확인하고, 모듈의 출력이며, case 문에서 그 값에 대한 조건을 만들 수있는 방법을, 한 점을 얻지 못했다? 귀하의 회신에 대해 사전에 감사합니다, 나는 if (~ 빈) 검사를 의미한다. 다른 예제를 참조하려는 경우 OpenCores에 게시된 많은 FIFO 구현을 찾을 수 있습니다. 우리가 몇 가지 예를 찾을 수 있는지 보자, 우리는 할까요? 이러한 게이팅이 유용할 수 있지만 이 예제에서는 필요하지 않습니다. FIFOs는 한 클럭 도메인에서 다른 클럭 도메인으로 다중 비트 데이터 단어를 안전하게 전달하거나 동일한 클럭 도메인에 있는 원본과 대상 측 간의 데이터 흐름을 제어하는 설계에 사용됩니다. 읽기 및 쓰기 클럭 도메인이 동일한 클럭 신호에 의해 제어되는 경우 FIFO는 동기적이라고 합니다.

이러한 다른 (비동기) 클럭 신호에 의해 제어 되는 경우 FIFO 비동기 라고 합니다. 동기 FIFO 예제는 여기에 설명되어 있습니다. 예를 들어 CPU는 UART 수신기에서 읽을 수 있는 항목(예: o_fill)을 알고 싶어하지만 송신기에서 얼마나 많은 항목을 쓸 수 있는지 알고 싶어합니다(N-1-ofill). 마찬가지로 CPU는 수신 큐가 절반(o_fill > N/2)이 될 때까지 기다려야 하는 반면, 전송 FIFO는 전송 큐가 절반(ofill < N/2-1)이 비어 있을 때까지 기다려야 합니다. 선생님…. 나는 도움이 필요합니다 ……….. 코드가 매우 유용했습니다……… 그러나 나는 코드의 일부를 이해하지 못한다….. 그래서 내가 이해 한 것에 따라 코드를 수정했으며이 코드도 작동합니다 ……………

아래에 코드를 붙여 넣습니다…… 난 그냥이 코드가 내 fpga에서 작동하는지 말해 주고 싶습니다 ………. 내 fPGA 시계 생성기 20Mhz에 따라 뭔가를 변경해야 ……….. 모듈 fifoo (wr, rd, clock, 재설정, din, dout);입력 wr, rd, 시계, 재설정;입력 [2:0] din;출력 reg [2:0] dout;reg 전체,빈;reg [2:0::]]:.). 0] wr_ptr, rd_ptr;reg [2:0] regarray [2**2-1:0];할당 wr_en=wr&(~full);always@(포즈티지 시계)beginif(wr_en) beginregarray[wr_ptr]=din;#1 $display(”작성된 %b%b”, wr_ptr, regarray[wr_ptr]);wr_ptr=wr_ptr+1`b1;endendassign rd_en=rd&(~empty);항상@(posedge clock)beginif(rd_en)begindout=regarray[rd_ptr];#1 $display(”읽기 %b %b”, rd_ptr, regarray] rd_ptr]);rd_ptr=rd_ptr+1`b1;endendalways@(포즈티지 리셋)beginwr_ptr=1`b0;rd_ptr=1`b0;전체=1`b0;빈 1`b1 *endalways@(*)begincase({rd,wr})2`b01: //writebeginif(~전체)는 빈 시작=1`b0;if(wr_ptr=2**2)beginfull=1`b1;$display(”fifo”). 전체………… 쓸 수 없다”);endendend2`b10: //readbeginif (~빈)beginfull=1`b0;if(rd_ptr=2)시작=1`b1;$display(”fifo 빈………………………………………………… 읽을 수 없습니다”);endendendcaseendmodulemodule tb_fifoo();와이어 [2:0] dout;reg wr, rd, clock, reset;reg [2:0] din;fifoo mm (wr, rd, clock, reset),din,dout);초기 시작 시계 =1`b0;재설정=1`b1;wr=1`b1;rd=1`b0;din=3`b111;#2;clock=1`b1;재설정= 1`b0;wr=1`b1;rd=1`b0;din=3`b111;#2;#2;1`b0;재설정=1`b0;wr=1`b1;rd=1`b0;din=3`b101;#2;시계=1`b1;재설정=1`b0;wr=1`b0;wr=1`b0;wr=1`b0;wr=1`b0;wr=1`b0;wr=1`b0;1`b1;rd=1`b0;din=3`b101;#2;clock=1`b0;재설정=1`b0;1`b0;wr=1`b1;rd=1`b10;#2;clock=1`b1;reset=1`b0;wr=1`b1;wr=1`b1;1`b0;rd=rd=rd1 1`b0;din=3`b110;#2;clock=1`b0;재설정=1`b0;wr=1`b1;rd=1`b0;din=3`b101;#2;clock=1`b1;재설정=1`b0;wr=1`b1;rd=1`b1;rd=1`b1;rdin=1`b0;din=1`b0;din=3`b101;#2;clock=1`b0;reset=1`b0;wr=1`b1;rd=1`b0;din=3`b101;#2;clock=1`b1;reset=1`b0;wr=1`b1;rd=1`b0;din=3`b0; din=3`b0; din=3`b0; #2;clock=1`b0;재설정=1`b0;wr=1`b1;rd=1`b0;din=3`b110;#2;clock=1`b1;재설정=1`b0;wr=1`b1;rd=1`b0;din=3`b110;#2;#2;시계=1`b0;재설정=1`b0;wr=1`b0;rd=1`b1;#2;clock=1`b1;재설정=1`b0;wr=1`b0;rd=1`b1;#2;clock=1`b0;재설정=1`b0;wr=1`b0;rd== 1`b1;#2;clock=1`b1;재설정=1`b0;wr=1`b0;rd=1`b1;#2clock=1`b0;재설정=1`b0;1`b0;wr=1`b0;rd=1`b1;#2;시계=1`b1;재설정=1`b0;wr = 1`b0;rd=1`b1;#2clock=1`b0;재설정=1`b0;wr=1`b0;rd=1`b1;#2;#2;1`b1;재설정=1`b0;wr=1`b0;rd=1`b1;#2;#2;clock=1`b0; rd 재설정=1`b0;wr=1`b0;rd=1`b1;#2;시계=1`b1;재설정=1`b0;rd=1`b1;#2;clock=1`b0;재설정=1`b0;wr=1`b1;rd=1`b0;din;din;din;din = 3`b101;#2;clock=1`b1;재설정=1`b0;wr=1`b1;rd=1`b0;din=3`b101;#2;clock=1`b0;reset=1`b0;rd=1`b1;wr=1`b0;rd=1`b1;#2;#2 1`b1;재설정=1`b0;wr=1`b0;rd=1`b1;#2;시계=1`b0;재설정=1`b1;wr=1`b0;rd=1`b1;#2;1`b1;재설정=1`b0;wr=1`b0;rd=1`b0;rd=1`b0 1;#2;clock=1`b0;재설정=1`b0;wr=1`b1;rd=1`b0;din=3`b101;#2;#2;1`b1;재설정=1`b0;wr=1`b1;rd=1`b0;din=3`b101;#2; clock=1`b0;재설정=1`b0;wr=1`b0;rd=1`b1;#2;#2;1`b1;재설정=1`b0;wr=1`b0;rd=1`b1;endendmodule FIFO의 깊이를 계산하기 위해서는 먼저 특정 설계의 최악의 시나리오를 이해해야 합니다.