플로팅 컴퓨팅 회로의 Verilog-HDL 구현 - 1.5 (LeadingZeros)

지난번
Float 계산 회로의 Verilog-HDL 구현에 관하여 - 그 1

이번 내용



마지막 보충
LeadingZeros 지우기에 대해

마지막 보충



5. 형의 생성에 대해서



자릿수 상승을 고려하여 float 유형을 생성합니다.
 //TIM5
reg [31:0] res;

always @(posedge clk) begin
    res[31] <= 1'b0;

    if (r[24]) begin
        res[30:23] <= vexp3 + 8'b1;
        res[22:0] <= r[23:1];
    end else begin
        res[30:23] <= vexp3;
        res[22:0] <= r[22:0];
    end
end

7행째의 if문으로
두 개의 추가 결과가 진행을 유발할지 여부를 결정합니다.
01XX + 0XXX\\
= 01XX\ or\ 1XXX

진행이 일어날 때 1 비트 이동하여 조정합니다.
진행이 일어나지 않으면 정상적으로 처리가 수행됩니다.
(정규화라고 할까)

LeadingZeros 삭제 정보



LeadingZeros 정보



왼쪽의 0을 LeadingZeros라고합니다.


8'd\ 8 = 8'b\ 0000\_1000

이 때의 상위 4 비트의 0 (같다).

왜 지울까



뺄셈에서 처음 1이 어디에 나타나는지 예측할 수 없습니다.
float 유형을 생성하려면 최상위 레벨 중 하나를 찾아야합니다 (?).

LeadingZeros 절단 모듈



leadingzero.sv
module lzsv(
    input wire clk,
    input wire [23:0] v,

    output wire [4:0] num,
    output wire [23:0] res
);

    // {num5, res24}
    reg [28:0] cnum;
    assign num = cnum[28:24];
    assign res = cnum[23:0];

always @(posedge clk) begin
    if (v[23]) cnum <= {5'd0, v};
    else if (v[22]) cnum <= {5'd1, v[22:0],  1'b0};
    else if (v[21]) cnum <= {5'd2, v[21:0],  2'b0};
    else if (v[20]) cnum <= {5'd3, v[20:0],  3'b0};
    else if (v[19]) cnum <= {5'd4, v[19:0],  4'b0};
    else if (v[18]) cnum <= {5'd5, v[18:0],  5'b0};
    else if (v[17]) cnum <= {5'd6, v[17:0],  6'b0};
    else if (v[16]) cnum <= {5'd7, v[16:0],  7'b0};
    else if (v[15]) cnum <= {5'd8, v[15:0],  8'b0};
    else if (v[14]) cnum <= {5'd9, v[14:0],  9'b0};
    else if (v[13]) cnum <= {5'd10, v[13:0], 10'b0};
    else if (v[12]) cnum <= {5'd11, v[12:0], 11'b0};
    else if (v[11]) cnum <= {5'd12, v[11:0], 12'b0};
    else if (v[10]) cnum <= {5'd13, v[10:0], 13'b0};
    else if (v[ 9]) cnum <= {5'd14, v[ 9:0], 14'b0};
    else if (v[ 8]) cnum <= {5'd15, v[ 8:0], 15'b0};
    else if (v[ 7]) cnum <= {5'd16, v[ 7:0], 16'b0};
    else if (v[ 6]) cnum <= {5'd17, v[ 6:0], 17'b0};
    else if (v[ 5]) cnum <= {5'd18, v[ 5:0], 18'b0};
    else if (v[ 4]) cnum <= {5'd19, v[ 4:0], 19'b0};
    else if (v[ 3]) cnum <= {5'd20, v[ 3:0], 20'b0};
    else if (v[ 2]) cnum <= {5'd21, v[ 2:0], 21'b0};
    else if (v[ 1]) cnum <= {5'd22, v[ 1:0], 22'b0};
    else if (v[ 0]) cnum <= {5'd23, 24'h800_000};
    else cnum <= {5'd24, 24'd0};
end

endmodule

이 설명은 어떨까요?

시뮬레이션 결과




카운트 업 된 acnt가 1 클럭 지연으로 0을 지우고 시프트 된 값이 res로 얻어 졌음을 알 수 있습니다.


자릿수 업데이트가 지수 적으로 길어지는 반면 숫자 업데이트가 매 클럭됩니다.

좋은 웹페이지 즐겨찾기