2016-10-18 1 views
0

LFSR에서 64 비트 출력을 얻으려고합니다. 나는 그물에 코드를 발견하고 그것을 64 비트 편집했습니다. 그러나 나는 결과를 얻지 못하고있다.Verilog에서 64 비트 LFSR 출력

module LFSR8_8E(reset_, clock, q, lfsr_to); 
    input clock, reset_; 
    output [63:0] q, lfsr_to; 

    reg [63:0] LFSR; 
    wire lfsr_to; 
    assign lfsr_to = (LFSR == 64'h9C69832196724182); 

    always @(posedge clock or negedge reset_) 
    begin 
    if (!reset_) LFSR[63:0] <= 64'h0000000000000000; 
     else 
    begin 
    if (lfsr_to) LFSR[63:0] <= 64'h0000000000000000; 
    else 
    begin 
    LFSR[63:63] <= LFSR[62:62]^LFSR[61:61]; 
    LFSR[62:62] <= LFSR[61:61]^LFSR[60:60]; 
    LFSR[61:61] <= LFSR[60:60]^LFSR[59:59]; 
    LFSR[60:60] <= LFSR[59:59]^LFSR[58:58]; 
    LFSR[59:59] <= LFSR[58:58]; 
    LFSR[58:58] <= LFSR[57:57]; 
    LFSR[57:57] <= LFSR[56:56]; 
    LFSR[56:56] <= LFSR[55:55]; 
    LFSR[54:54] <= LFSR[53:53]; 
    LFSR[53:53] <= LFSR[52:52]; 
    LFSR[52:52] <= LFSR[51:51]; 
    LFSR[51:51] <= LFSR[50:50]; 
    LFSR[49:49] <= LFSR[48:48]; 
    LFSR[48:48] <= LFSR[47:47]; 
    LFSR[47:47] <= LFSR[46:46]; 
    LFSR[46:46] <= LFSR[45:45]; 
    LFSR[45:45] <= LFSR[44:44]; 
    LFSR[44:44] <= LFSR[43:43]; 
    LFSR[43:43] <= LFSR[42:42]; 
    LFSR[42:42] <= LFSR[41:41]; 
    LFSR[41:41] <= LFSR[40:40]; 
    LFSR[39:39] <= LFSR[38:38]; 
    LFSR[38:38] <= LFSR[37:37]; 
    LFSR[37:37] <= LFSR[36:36]; 
    LFSR[36:36] <= LFSR[35:35]; 
    LFSR[35:35] <= LFSR[34:34]; 
    LFSR[34:34] <= LFSR[33:33]; 
    LFSR[33:33] <= LFSR[32:32]; 
    LFSR[32:32] <= LFSR[31:31]; 
    LFSR[31:31] <= LFSR[30:30]; 
    LFSR[29:29] <= LFSR[28:28]; 
    LFSR[28:28] <= LFSR[27:27]; 
    LFSR[27:27] <= LFSR[26:26]; 
    LFSR[26:26] <= LFSR[25:25]; 
    LFSR[25:25] <= LFSR[24:24]; 
    LFSR[24:24] <= LFSR[23:23]; 
    LFSR[23:23] <= LFSR[22:22]; 
    LFSR[22:22] <= LFSR[21:21]; 
    LFSR[21:21] <= LFSR[20:20]; 
    LFSR[29:29] <= LFSR[28:28]; 
    LFSR[28:28] <= LFSR[27:27]; 
    LFSR[27:27] <= LFSR[26:26]; 
    LFSR[26:26] <= LFSR[25:25]; 
    LFSR[25:25] <= LFSR[24:24]; 
    LFSR[24:24] <= LFSR[23:23]; 
    LFSR[23:23] <= LFSR[22:22]; 
    LFSR[22:22] <= LFSR[21:21]; 
    LFSR[21:21] <= LFSR[20:20]; 
    LFSR[20:20]<= LFSR[19:19]; 
    LFSR[19:19] <= LFSR[18:18]; 
    LFSR[18:18] <= LFSR[17:17]; 
    LFSR[17:17] <= LFSR[16:16]; 
    LFSR[16:16] <= LFSR[15:15]; 
    LFSR[15:15] <= LFSR[14:14]; 
    LFSR[14:14] <= LFSR[13:13]; 
    LFSR[13:13] <= LFSR[12:12]; 
    LFSR[12:12] <= LFSR[11:11]; 
    LFSR[11:11] <= LFSR[10:10]; 
    LFSR[10:10]<= LFSR[9:9]; 
    LFSR[9:9] <= LFSR[8:8]; 
    LFSR[8:8] <= LFSR[7:7]; 
    LFSR[7:7] <= LFSR[6:6]; 
    LFSR[6:6] <= LFSR[5:5]; 
    LFSR[5:5] <= LFSR[4:4]; 
    LFSR[4:4] <= LFSR[3:3]; 
    LFSR[3:3] <= LFSR[2:2]; 
    LFSR[2:2] <= LFSR[1:1]; 
    LFSR[1:1] <= LFSR[0:0]; 
    LFSR[0:0] <= LFSR[63:63]; 
    end 
    end 
    end 

    assign q = LFSR; 
    endmodule 

FPGA에서 64 입력 회로를 구동하기 위해 64 비트 출력을 얻으려고합니다. 코드를 합성하여 LFSR을 생략했습니다.

[신디 8-3332] 순차 소자 (LFSR_reg [63])과 미사용 모듈 LFSR8_8E에서 제거 될 것이다. (63 이상과 같이)

알기나 어떻게 작동 도착. 제대로 기능하는 미리

SIMULATION

답변

0

초기화 값 또는 LFSR의 종자

덕분 중요하다. 위의 디자인에서 LFSR 레지스터에 재설정 값 또는 '0'을 할당합니다. '0'초기 값으로 각 클럭 에지에서 XOR 연산을 통해 계산 된 LFSR의 새 값은 '0'이됩니다. 따라서 LFSR은 항상 '0'값을 갖습니다.

합성 도구는 코드를 구문 분석하고 코드에서 연산을 수행해도 LFSR 레지스터의 값이 변경되지 않는다고 간주합니다. 따라서 전체 LFSR 레지스터가 다듬어 져서 경고 메시지가 표시됩니다. [Synth 8-3332]

LFSR의 절대로 모든 값이 0이어야합니다. 재설정 값을 64'hffff_ffff_ffff_ffff로 수정하면 LFSR이 올바르게 작동합니다.

수정 된 코드는 다음과 같습니다. 내가 지적하고 싶은

module LFSR8_8E(reset_, clock, q, lfsr_to); 
    input clock, reset_; 
    output [63:0] q; 
    output lfsr_to; 

    reg [63:0] LFSR; 
    wire lfsr_to; 

    assign lfsr_to = (LFSR == 64'h9C69832196724182); 

    always @(posedge clock or negedge reset_) 
    begin 
    if (!reset_) 
     LFSR[63:0] <= 64'hffff_ffff_ffff_ffff; 
    else if (lfsr_to) 
     LFSR[63:0] <= 64'hffff_ffff_ffff_ffff; 
    else 
    begin 
     LFSR[63:0] <= {(LFSR[62]^LFSR[61]), 
        (LFSR[61]^LFSR[60]), 
        (LFSR[60]^LFSR[59]), 
        (LFSR[59]^LFSR[58]), 
        LFSR[58:0], 
        LFSR[63]}; 
    end 
    end 

    assign q = LFSR; 
endmodule 

또 한가지는 LFSR이 최대 길이 LFSR, 다음 조건 인 경우

else if (lfsr_to) 
     LFSR[63:0] <= 64'hffff_ffff_ffff_ffff; 

필요가 없다는 것이다. LFSR 레지스터는 자동으로 초기 값으로 롤오프됩니다. 코드를 살펴보면 LFSR 다항식이 최대 길이를 생성하지 않는다고 생각합니다. 여기 EDA 놀이터 설계의 시뮬레이션 밖으로 Wikipedia

확인에 표준 LFSR의 다항식의 일부를 보라 할 수 있습니다 https://www.edaplayground.com/x/5NpK

당신은 외부 신호에 기초하여 LFSR을 해제해야하는 경우 수정 된 코드는 https://www.edaplayground.com/x/n7Q

+0

에 있습니다. 웹에서 나는 64 비트 LFSR을 위해 64,63,62,61 비트를 사용할 필요가 있음을 발견했다. 또한, 나는 Verilog과이 물건을 처음 사용하고 지식이 거의 없다. 나는이 lfsr을 사용하여 벤치 마크 코드를 만들고 싶다. 그래서 기본적으로 64 비트 출력을 제공하는 lfsr을 설계하고 싶습니다. 코드를 수정했습니다. –

+0

@ EmilyBlake 제공 한 코드를 거의 또는 전혀 수정하지 않고 사용할 수 있습니다. 위 응답에서 EDA 놀이터 링크를 따라 가면 설계를 테스트하는 데 사용한 테스트 벤치가 표시됩니다. – Prashant

+0

@prasant 리셋 신호가 높은 동안 LFSR을 비활성화하는 방법이 있습니까? 함께 작동하는 두 개의 LFSR이 필요하고 언젠가 후에 하나는 비활성화되어야합니다. –

관련 문제