플로팅 컴퓨팅 회로의 Verilog-HDL 구현 - 1.5 (LeadingZeros)
3579 단어 FPGAVerilogfloat하드웨어VerilogHDL
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.svmodule 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로 얻어 졌음을 알 수 있습니다.
자릿수 업데이트가 지수 적으로 길어지는 반면 숫자 업데이트가 매 클럭됩니다.
Reference
이 문제에 관하여(플로팅 컴퓨팅 회로의 Verilog-HDL 구현 - 1.5 (LeadingZeros)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Soleiyu/items/2fbd44883cfb1cdd253d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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.svmodule 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로 얻어 졌음을 알 수 있습니다.
자릿수 업데이트가 지수 적으로 길어지는 반면 숫자 업데이트가 매 클럭됩니다.
Reference
이 문제에 관하여(플로팅 컴퓨팅 회로의 Verilog-HDL 구현 - 1.5 (LeadingZeros)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Soleiyu/items/2fbd44883cfb1cdd253d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
8'd\ 8 = 8'b\ 0000\_1000
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
Reference
이 문제에 관하여(플로팅 컴퓨팅 회로의 Verilog-HDL 구현 - 1.5 (LeadingZeros)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Soleiyu/items/2fbd44883cfb1cdd253d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)