2014-12-15 2 views
0

내가해야할 일은 시계를 사용하지 않고 장 구간을 사용하는 분배기를 만드는 것입니다. 내 현재 코드는 올바르게 알고리즘을 구현하는 것처럼 보이지만 ... 문제가 있습니다. 내 출력이 초기화되지 않았습니다. 그들의 값은 항상 X입니다. 와이어를 초기화하는 방법을 잘 모르겠습니다. (필자는 그렇게하지 않았다고 생각 했습니까?) 출력에 reg를 사용하려했지만 for 루프를 사용하여 복잡한 작업을 수행했습니다. 내가 무엇을 할 수 있을지?Verilog에서 비동기 이진 디바이더 디자인하기

`timescale 1ns/1ns 

module alu_div(dividend, divisor, quotient, remainder); 
    input wire[31:0] dividend, divisor; 
    output wire[31:0] quotient, remainder; 

    genvar i; 
    generate 
    for (i = 31; i >= 0; i = i - 1) begin 
     assign remainder = remainder << 1; 
     assign remainder[0] = dividend[i]; 
     assign remainder = ((remainder >= divisor) ? (remainder - divisor):remainder); 
     assign quotient[i] = ((remainder >= divisor) ? 1:quotient[i]); 
    end 
    endgenerate 

endmodule 

답변

0

assigns 따라서 아무 의미도하지 않습니다 다음 연속 할당됩니다

assign remainder = remainder << 1; 
assign remainder[0] = dividend[i]; 
assign remainder = ((remainder >= divisor) ? (remainder - divisor):remainder); 

삭제 한 질문은 당신이 필요로했던 것을 훨씬 더 가까이 있었다. 이 상황에서는 생성 문이 과도합니다. 당신이 알 무엇

integer i; 
always @* begin 
    for (i = 31; i >= 0; i = i - 1) begin 
    remainder = remainder << 1; 
    remainder[0] = dividend[i]; 
    remainder = ((remainder >= divisor) ? (remainder - divisor):remainder); 
    quotient[i] = ((remainder >= divisor) ? 1:quotient[i]); 
    end 
end 

remainder 루프의 각 반복에서 재정의됩니다 있다는 것입니다. 이것은 아마도 각 반복이 자체 값을 갖도록 메모리 (배열)로 바뀔 필요가 있습니다. 이것은 적어도 각 단계에서 어떤 일이 벌어지는지를 볼 수 있기 때문에 디버깅을 도울 것입니다.

reg [31:0] remainder [0:31]; 
integer i; 
always @* begin 
    for (i = 31; i >= 0; i = i - 1) begin 
    remainder[i] = remainder[i] << 1; 
    remainder[i][0] = dividend[i]; 
    remainder[i] = ((remainder[i] >= divisor) ? (remainder[i] - divisor):remainder[i]); 
    quotient[i]  = ((remainder[i] >= divisor) ? 1:quotient[i]); 
    end 
end