Float 계산 회로의 Verilog-HDL 실장에 대해 -그 3(적산 회로)
3959 단어 FPGAVerilogfloat하드웨어VerilogHDL
Float 계산 회로의 Verilog 구현
~ FPGA에 올리고 싶다 ~
올레올레 구현이므로 잘못되어도 몰라요
가산회로편
Float 계산 회로의 Verilog-HDL 구현에 관하여 - 그 1
디버그 툴 작성편
Float 계산 회로의 (ry-그 1.1(float값의 16진수 표기)
보충과 LeadingZeros편
플로팅 컴퓨팅 회로의 Verilog-HDL 구현 - 1.5 (LeadingZeros)
감산회로편
Float 계산 회로의 Verilog-HDL 구현에 대해 -그 2(감산편)
회로 공통화와 타이밍 조정편
Float 계산 회로의 Verilog-HDL 구현에 대해 - 그 2.1 (가산 회로의 공통화와 타이밍 조정)
공통화편
Float 계산 회로의 Verilog-HDL 구현에 대해 - 2.5 (공통화)
0대응편
Float 계산 회로의 Verilog-HDL 구현에 대해 - 그 2.7 (0 대응)
목적
float 공부
float32의 하드웨어 구현
0에 대응하지 않는 적산 회로의 실장을 실시한다
전회까지의 가감산 회로와의 공통화는 실시하지 않는다.
이번 HW
코드
module float_mul(
input wire clk,
input wire [31:0] v1,
input wire [31:0] v2,
output wire [31:0] vres
);
assign vres = res;
// TIM1
reg [7:0] v1e;
reg [7:0] v2e;
reg [23:0] v1v;
reg [23:0] v2v;
reg v1o;
reg v2o;
// TIM2
reg [7:0] re;
reg [47:0] rv;
reg ro;
// TIM3
reg [31:0] res;
always @(posedge clk) begin
// TIM1
v1e <= (v1[30:23] - 8'h7F);
v2e <= (v2[30:23] - 8'h7F);
v1v <= {1'b1, v1[22:0]};
v2v <= {1'b1, v2[22:0]};
v1o <= v1[31];
v2o <= v2[31];
// TIM2
re <= v1e + v2e;
rv <= v1v * v2v;
ro <= v1o ^ v2o;
// TIM3
if (rv[47]) begin
res <= {ro, re + 8'h80, rv[46:24]};
end else begin
res <= {ro, re + 8'h7F, rv[45:23]};
end
end
endmodule
127과 128
계산 도중 내려가고 있기 때문입니다.
시뮬레이션 결과 및 오차
값 1
값 2
결과
정답
오차
7.25
123.4
894.64996
894.65
0.00004
7.25
0.00123
0.0089175
0.0089175
0
0.725
123.4
89.465004
89.465
0.000004
0.725
0.00123
0.00089175004
0.00089175
0.0000000004
쁘띠 개량(?)
// TIM3
if (rv[47]) begin
res <= {ro, re + 8'h80, rv[46:24] + {22'b0, rv[23]}};
end else begin
res <= {ro, re + 8'h7F, rv[45:23] + {22'b0, rv[22]}};
end
반올림 도입
어쩌면 괜찮지 만 OF는 몰라
시뮬레이션 결과 및 오차
값 1
값 2
결과
정답
오차
7.25
123.4
894.65
894.65
0
7.25
0.00123
0.0089175
0.0089175
0
0.725
123.4
89.465004
89.465
0.000004
0.725
0.00123
0.0008917501
0.00089175
0.0000000001
오차가 커지거나 작아지거나 변하지 않거나
Reference
이 문제에 관하여(Float 계산 회로의 Verilog-HDL 실장에 대해 -그 3(적산 회로)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Soleiyu/items/8a17ce204d093e11773e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
module float_mul(
input wire clk,
input wire [31:0] v1,
input wire [31:0] v2,
output wire [31:0] vres
);
assign vres = res;
// TIM1
reg [7:0] v1e;
reg [7:0] v2e;
reg [23:0] v1v;
reg [23:0] v2v;
reg v1o;
reg v2o;
// TIM2
reg [7:0] re;
reg [47:0] rv;
reg ro;
// TIM3
reg [31:0] res;
always @(posedge clk) begin
// TIM1
v1e <= (v1[30:23] - 8'h7F);
v2e <= (v2[30:23] - 8'h7F);
v1v <= {1'b1, v1[22:0]};
v2v <= {1'b1, v2[22:0]};
v1o <= v1[31];
v2o <= v2[31];
// TIM2
re <= v1e + v2e;
rv <= v1v * v2v;
ro <= v1o ^ v2o;
// TIM3
if (rv[47]) begin
res <= {ro, re + 8'h80, rv[46:24]};
end else begin
res <= {ro, re + 8'h7F, rv[45:23]};
end
end
endmodule
// TIM3
if (rv[47]) begin
res <= {ro, re + 8'h80, rv[46:24] + {22'b0, rv[23]}};
end else begin
res <= {ro, re + 8'h7F, rv[45:23] + {22'b0, rv[22]}};
end
Reference
이 문제에 관하여(Float 계산 회로의 Verilog-HDL 실장에 대해 -그 3(적산 회로)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Soleiyu/items/8a17ce204d093e11773e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)