2014-05-17 1 views
3

자일링스 FPGA를위한 부스의 알고리즘 (유한 상태 기계 구현)을 구현하려고합니다. 기본적으로, 시작 신호에서 보조 레지스터를 초기화 한 다음 상태 0으로 이동합니다. 여기에서 2 비트를 비교하고 이동을 시작합니다. 상태 4에 도달 할 때까지이 작업을 반복합니다.부스의 알고리즘 Verilog 합성 가능

assign Result = P[8:1]; 

[email protected](posedge clk or negedge start) 
    if(start == 1) 
    begin 
      // initialize with start values 
     state <= 3'd0; 
    end 

    else 
    if(state == 3'd0 || state == 3'd1 || state == 3'd2 || state == 3'd3) 
    begin 
     // compare bits and shift data 
    end 
endmodule 

테스트 모듈

clk = 0; 
a = 4'b0011; 
b = 4'b0011; 
b = ~b+1; 
start = 1; 
#10; 
start = 0; 

CLK가된다 ~ # 5 시간 단위 후의 CLK.

나는 FPGA를 소유하고 있지 않기 때문에 프로그램을 테스트 할 수 없다. (나는 나중에 클래스에서 테스트해야 할 것이다.)

나는 이카로스로 테스트 중이다. 문제는 보조 레지스터가 시계의 첫 번째 순위보다 먼저 초기화되지 않는다는 것입니다.

보조 변수를 제대로 초기화하고 코드를 합성 가능하게 유지하려면 어떻게해야합니까? for 루프와 초기 시작을 사용하여 시도했지만 시뮬레이션은 정상적으로 작동하지만 FPGA에서 작동하지 않습니다 (#delays를 사용해야하기 때문에).

+1

쉬운 방법 (또는 '0'에 대한 'rst_n') =='1 '추가 reset' 신호와 리셋 할 때'REGS를 초기화하는 것이다. – Qiu

+0

초기화되지 않은 "보조 규정"이란 무엇입니까? '국가'? – Morgan

+0

해결했습니다! 초기화되지 않은 "보조 규정"은 중급 결과 (예 : 'a'가있는 '0000') 또는 숫자 a의 2의 보수입니다. –

답변

2

ASIC의 경우 액티브 로우 리셋을 사용하여 초기 값을 설정하는 것이 가장 바람직하지만 FPGA의 경우 초기 값을 initial 블록으로 설정하는 것이 일반적입니다.

initial begin 
    state = 'd0 ; 
end 

[email protected](posedge clk) begin 
    if(state == 3'd0 || state == 3'd1 || state == 3'd2 || state == 3'd3)begin 
    // compare bits and shift data 
    state <= 3'd4 ; 
    end 
endmodule 

액티브 로우 리셋을 사용 중입니다.

[email protected](posedge clk or negedge rst_n) begin 
    if (~rst_n) begin 
    state <= 'd0 ; 
    end 
    else begin 
    if(state == 3'd0 || state == 3'd1 || state == 3'd2 || state == 3'd3)begin 
     // compare bits and shift data 
     state <= 3'd4 ; 
    end 
    end 
endmodule 
+1

ASIC에서 활성 리셋을 사용하는 이유는 다음과 같습니다. https://groups.google.com/forum/#!topic/comp.lang.verilog/WI1Ob8C0dzg – e19293001

관련 문제