Float 계산 회로의 Verilog-HDL 구현에 대해 -그 2(감산편)

Float 계산 회로의 Verilog 구현



~ FPGA에 올리고 싶다 ~
올레올레 구현이므로 잘못되어도 몰라요

가산회로편
Float 계산 회로의 Verilog-HDL 구현에 관하여 - 그 1

디버그 툴 작성편
Float 계산 회로의 (ry-그 1.1(float값의 16진수 표기)

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

(기본) 감산만
양수 1 - 양수 2
가다랭이 수 1> 수 2

거의 전회와 함께.

목적



float 공부
float32의 하드웨어 구현

부동 소수점 수 빼기



올레올레 부동 소수점 가산 회로의 타이밍은 아래 그림과 같이 설계되었습니다.


이하 상세

1. 값 비교



숫자 비교를 수행하고 큰 값을 vb (값 큰), 작은 값을 vs (값 작은)에 저장합니다.
가산 회로와 달리 코드 이야기가 관련되어 있기 때문에 완전히 크고 작은 것을 분리하고 싶습니다.
//TIM1
reg [31:0] vb;
reg [31:0] vs;

always @(posedge clk) begin
    // TIM1 //
    if (v2[30:23] < v1[30:23]) begin
        vb <= v1;
        vs <= v2;
    end else if (v1[30:23] < v2[30:23]) begin
        vb <= v2;
        vs <= v1;
    end else if (v2[22:0] < v1[22:0]) begin
        vb <= v1;
        vs <= v2;
    end else begin
        vb <= v2;
        vs <= v1;
    end
end  

지수부에서 크고 작은 비교
지수부가 동일하면 가수부에서 대소 비교

2. 지수부 거리의 계산



시프트 량을 파악하기 위해 각 수치의 지수 부분 거리를 계산합니다.
다른 사람은 파이프 라인에서 파손되지 않도록 보호합니다.
//TIM2
reg [7:0] dexp;
reg [7:0] vexp;
reg [22:0] vb2;
reg [22:0] vs2;

always @(posedge clk) begin
    dexp <= vb[30:23] - vs[30:23];
    vexp <= vb[30:23];

    vb2 <= vb[22:0];
    vs2 <= vs[22:0];                                                                                     
end

3. 값 이동, 감산 준비



뺄셈을 위해 1을 추가하거나 값을 이동하여 숫자를 맞 춥니 다.
이 때 작은 숫자는 시프트 할 때 잘립니다 (올바른지 모르겠습니다).
//TIM3
reg [7:0] vexp2;
reg [24:0] vb3;
reg [24:0] vs3;

always @(posedge clk) begin
    vexp2 <= vexp;

    vb3 <= {2'b1, vb2};
    vs3 <= {1'b0, vssf({1'b1, vs2}, dexp)};
end

시프트 방법은 머리 좋은 방법을 아직 모르고 마지막을 사용합니다.

4. 감산



숫자가 일치하므로 빼기 만 수행됩니다.
//TIM4
reg [7:0] vexp3;
reg [24:0] r;

always @(posedge clk) begin
    vexp3 <= vexp2;

    r <= vb3 - vs3;                                                                                
end

5. LeadingZeros 처리



LeadingZeros 처리
지수 부분을 만지십시오.
LeadingZeros 모듈 lzsv에서
1 클럭 소화되기 때문에
//TIM5, 6
reg [7:0] vexp4;
reg [7:0] vexp5;
reg [23:0] lzr;
wire [4:0] lznum;
wire [23:0] lzres;

lzsv lzm(
    .clk(clk),
    .v(r),
    .num(lznum),
    .res(lzres)
);

always @(posedge clk) begin
    vexp4 <= vexp3;
    vexp5 <= vexp4 - {3'b0, lznum};

    lzr <= lzres;
end

6. 유형 생성


//TIM7
reg [31:0] res;

always @(posedge clk) begin
    res[31] <= 1'b0;
    res[30:23] <= vexp5;
    res[22:0] <= lzr[22:0];
end

float 형을 생성합니다.

시뮬레이션 결과




123.4\ -\ 7.25 = 116.15\\
42F6\_CCCD\ -\ 40E8\_0000 = 42E8\_4CCD



글쎄, 그렇지 않니?

자릿수 브레 브레 나노하 애교

좋은 웹페이지 즐겨찾기