Float 계산 회로의 Verilog-HDL 구현에 대해 -그 2(감산편)
3868 단어 FPGAVerilogfloat하드웨어VerilogHDL
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
글쎄, 그렇지 않니?
자릿수 브레 브레 나노하 애교
Reference
이 문제에 관하여(Float 계산 회로의 Verilog-HDL 구현에 대해 -그 2(감산편)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Soleiyu/items/b56d3db666bd93f9ef75
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
//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
//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
//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
//TIM4
reg [7:0] vexp3;
reg [24:0] r;
always @(posedge clk) begin
vexp3 <= vexp2;
r <= vb3 - vs3;
end
//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
//TIM7
reg [31:0] res;
always @(posedge clk) begin
res[31] <= 1'b0;
res[30:23] <= vexp5;
res[22:0] <= lzr[22:0];
end
123.4\ -\ 7.25 = 116.15\\
42F6\_CCCD\ -\ 40E8\_0000 = 42E8\_4CCD
Reference
이 문제에 관하여(Float 계산 회로의 Verilog-HDL 구현에 대해 -그 2(감산편)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Soleiyu/items/b56d3db666bd93f9ef75텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)