개인적으로 경험한 Vivado 오류 요약

6705 단어 FPGA

개요



개인적으로 발생한 오류와 해결된 결과를 나열했습니다.

여러 always 문


module Register(
    input [3:0] in,
    output reg [3:0] out,
    input CLK,
    input Reset
    );

    always @(posedge CLK)
    begin
        out <= in;
    end

    always @ (posedge Reset)
    begin
        out <= 4'h0;
    end

endmodule
[DRC MDRV-1] Multiple Driver Nets:
 Net Register1/out[0] has multiple drivers:
 Register1/out_reg[0]__0/Q, and Register1/out_reg[0]/Q.



리셋을 별도로 기술 한 결과, 4bitRegister를 만들려고했지만 Register가 2set (8bit) 생성되어 버렸다.
그런 다음 두 개의 레지스터 출력이 직접 연결되어 멀티 드라이버 오류가 발생합니다.
always 문을 하나로 정리하면 해결되었습니다.

orderd port and named port


[Synth 8-2543] port connections cannot be mixed ordered and named 
multiplexer multi1(.in1(switch[3:0]),in2(switch[7:4]), .out(out), .select(in[0]));

따라서 모듈을 연결할 때 발생했습니다.

원인


in2(switch[7:4])

에서 $.$를 붙여 잊어 버렸기 때문에 발생했습니다.

다중 비트 라인 연결


module GAWA(
    input [3:0] in,
    output [3:0] out,
    input [2:0] BTN,
    input [7:0] switch
    );

    multiplexer multi1(.in1(switch[3:0]),.in2(switch[7:4]), .out(out), .select(in[0]));

endmodule

module multiplexer(
    input [3:0] in1,
    input [3:0] in2,
    output[3:0] out,
    input select
    );

    function [3:0] Select;
        input select;
        input in1;
        input in2;
    begin
        if(select == 1)
            Select = in1;
        else
            Select = in2;
     end
     endfunction

     assign out = Select(select,in1,in2);

endmodule

보기 흉한 코드이지만. . .

결과




0bit째 이후는 GND가 되어 버리고 있다. 실제로 FPGA에 도입해도 마찬가지입니다.

원인


function [3:0] Select;
        input select;
        input in1;
        input in2;
    begin
        if(select == 1)
            Select = in1;
        else
            Select = in2;
     end
     endfunction

여기서 input in1, in2의 비트 크기를 지정하지 않았습니다. 지정하지 않으면 1 비트가됩니다.
결과적으로 사용하는 모듈에서 이상합니다.
이것은 오류를 토하지 않는 것에 놀랐습니다.

수정했을 때 치료했다.


생각한 행동을 하지 않는다



비트 파일의 선택을 다른 것으로 만들었기 때문에 계속 변경되지 않았습니다.
이것은 너무 바보입니다.

디멀티플렉서 생성 방법



function 문, case로 만들었습니다.
[3 : 0] 선택 정보를 사용하여 CLK를 [15 : 0] OUT 중 어느 것에 연결할지 선택할 수 있습니다.
module DeMultiplexer(
    input CLK,
    input [3:0] Select,
    output [15:0] Out
    );

    function [15:0]out;
    input [3:0]Select;
    input in;
        case(Select)
            4'h0:out[0] = in;
            4'h1:out[1] = in;
            4'h2:out[2] = in;
            4'h3:out[3] = in;
            4'h4:out[4] = in;
            4'h5:out[5] = in;
            4'h6:out[6] = in;
            4'h7:out[7] = in;
            4'h8:out[8] = in;
            4'h9:out[9] = in;
            default : out = 16'h0000;
        endcase
    endfunction

    assign Out = out(Select,CLK);   

endmodule
module GAWA(
    input clock,
    input [3:0]SW,
    output [3:0]LED
    );

    reg [26:0] D; 
    always @ (posedge clock)
    begin
     D <= D+1;
    end

    wire [15:0]Out;
    DeMultiplexer DeMultiplexer(.CLK(D[26]), .Out(Out),.Select(SW));

    assign LED[0] = Out[0];
    assign LED[1] = Out[1];
    assign LED[2] = Out[2];
    assign LED[3] = D[26];



endmodule

이제 실행하면. 확실히 Select를 선택하면 출력을 선택할 수있었습니다.
그러나 LED는 Out [0] ~ [2]까지만 지정했지만 Select-> LED의 대응은

0->0
1->1
2->2
3->2
4->0
5->1
6->2
7->2
8->OFF
9 이후 OFF

Select가 3~7의 동작이 이상하다

원인


        case(Select)
            4'h0:out[0] = in;
            4'h1:out[1] = in;
            4'h2:out[2] = in;
            4'h3:out[3] = in;
            4'h4:out[4] = in;
            4'h5:out[5] = in;
            4'h6:out[6] = in;
            4'h7:out[7] = in;
            4'h8:out[8] = in;
            4'h9:out[9] = in;
            default : out = 16'h0000;
        endcase

case문으로 out의 1bit만의 동작을 지정하고 있기 때문이 아닌가?
module DeMultiplexer(
    input CLK,
    input [3:0] Select,
    output [15:0] Out
    );

    function [15:0]out;
    input [3:0]Select;
    input in;
        case(Select)
            4'h0:begin
                out[0] = in;
                out[15:1] = 0;
                end
            4'h1:begin
                out[0] = 0;
                out[1] = in;
                out[15:2] = 0;
                end
            4'h2:begin
                out[1:0] = 0;
                out[2] = in;
                out[15:3] = 0;
                end
            4'h3:begin
                out[2:0] = 0;
                out[3] = in;
                out[15:4] = 0;
                end
            4'h4:begin
                out[3:0] = 0;
                out[4] = in;
                out[15:5] = 0;
                end
            4'h5:begin
                out[4] = 0;
                out[5] = in;
                out[15:6] = 0;
                end
            4'h6:begin
                out[5] = 0;
                out[6] = in;
                out[15:7] = 0;
                end
            4'h7:begin
                out[6] = 0;
                out[7] = in;
                out[15:8] = 0;
                end
            4'h8:begin
                out[7] = 0;
                out[8] = in;
                out[15:9] = 0;
                end
            4'h9:begin
                out[8] = 0;
                out[9] = in;
                out[15:10] = 0;
                end
            default : out = 16'h0000;
        endcase
    endfunction

    assign Out = out(Select,CLK);   

endmodule

다른 비트도 제대로 지정했는데 문제없이 동작했다.

그러나 더 좋은 글이 있다고 생각하기 때문에 누군가를 말해주십시오.

if 문의 논리 곱


if(a>5 and b>2)

오류가 발생합니다.
if(a>5 && b>2)

에서 지나갑니다.

좋은 웹페이지 즐겨찾기