Verilog有符号数运算,四舍五入,饱和截位

该博客探讨了如何使用Verilog实现四舍五入和饱和截位的无符号整数运算。通过两个设计方案,详细展示了将有符号整数转换为无符号整数的过程,并提供了MATLAB的量化比较。内容包括模块定义、中间变量赋值和四舍五入判断,以及测试激励的生成和验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文章【设计经验】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<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值