参考文章【设计经验】5、Verilog对数据进行四舍五入(round)与饱和(saturation)截位
当前还有存疑,请大家指正
题目:
请用Verilog实现算法 Q = K * (D - 16),其中输入数据D和输出数据D和输出数据Q都是无符号8位整数(无符号,8位整数,0位小数),输入参数K的数值为13Q10(共13位,1位符号位,10位小数位),中间过程保留完整精度,最后四舍五入。
答案1
1.先按照参考文章得到有符号整数输出,然后变到无符号输出
assign Q = Q1 + 128;转成无符号数。
module DaHua_2021_17(
input [7:0] D,
input signed [12:0] K,//13Q10
output [7:0] Q
);
wire signed [8:0] D_min_16;//9Q0
wire signed [21:0] K_mul;//22Q10
wire signed [12:0] rou_K_mul; //13Q0;
wire cin;
wire [13:0] un;
wire signed [7:0] Q1;
assign D_min_16 = D - 16;
assign K_mul = K * D_min_16;
assign cin = K_mul[21]? K_mul[9]&(|K_mul[8:0]) : K_mul[9];
assign rou_K_mul = {
K_mul[21],K_mul[21:10]} + cin;
assign Q1 = (rou_K_mul[12:7] == 6'b111111 || rou_K_mul[12:7] == 6'b000000)? rou_K_mul[7:0]:{
rou_K_mul[12],{
7{
!rou_K_mul[12]}}};
assign Q = Q1 + 128;
endmodule
答案2
按照matlab函数
quan_U8Q0_pattern = quantizer(‘ufixed’,‘round’,‘saturate’,[8,0]),
s_U8Q0 = quantize(quan_U8Q0_pattern,s);的结果而来
module DaHua_2021_17(
input [7<