参考文章【设计经验】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,//13Q10output [7:0] Q);wire signed [8:0] D_min_16;//9Q0wire signed [21:0] K_mul;//22Q10wire 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:0] D,input signed [12:0] K,//13Q10output [7:0] Q);wire signed [8:0] D_min_16;//9Q0wire signed [21:0] K_mul;//22Q10wire signed [12:0] rou_K_mul; //13Q0;wire cin;wire [13:0] un;wire signed [8: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:8] == 5'b11111 || rou_K_mul[12:8] == 5'b00000)? rou_K_mul[8:0]:{rou_K_mul[12],{8{!rou_K_mul[12]}}};assign Q = !Q1[8]? Q1[7:0]:0;
endmodule

对比s_U8Q0与Q,此时quan_U8Q0_pattern = quantizer(‘ufixed’,‘round’,‘saturate’,[8,0]);

结果和matlab s_U8Q0 = quantize(quan_U8Q0_pattern,s);得到的结果一样

中间过程
验证四舍五入结果
对比s = K_13Q10 .* s0与rou_K_mul

若要求输出有符号整数输出,答案1的Q1即为答案
quan_U8Q0_pattern = quantizer(‘fixed’,‘round’,‘saturate’,[8,0]);
D_U8Q0 = quantize(quan_U8Q0_pattern,D);
当D小于等于127时,D_U8Q0 = D,大于127时,输出127

s_U8Q0 = quantize(quan_U8Q0_pattern,s);
对比答案1的Q1与s_U8Q0

tb文件

module tb_dahua_2021_17();reg [7:0] D;
reg [12:0] K;
reg I_clk,I_rst_n;
wire [7:0] Q;parameter C_DATA_LENGTH = 4096;reg [7:0] M_men_D[0:C_DATA_LENGTH-1];
reg [12:0] M_men_K[0:C_DATA_LENGTH-1];
reg [13:0] R_men_addr;
reg R_data_valid;
reg R_data_valid_t;
DaHua_2021_17 ins(.D(D),.K(K),//13Q10.Q(Q));initial  beginI_clk = 0;I_rst_n = 0;#67;I_rst_n = 1;
end
always #5 I_clk = !I_clk;
initial begin$readmemh("D:/job/signed_cal/D_U8Q0.txt",M_men_D);$readmemh("D:/job/signed_cal/K_13Q10.txt",M_men_K);
endalways@(posedge I_clk or negedge I_rst_n) beginif(!I_rst_n) beginD <= 0;K <= 0;R_men_addr <= 14'd0;R_data_valid <= 1'b0;endelse if (R_men_addr == C_DATA_LENGTH) beginR_men_addr <= C_DATA_LENGTH;R_data_valid <= 1'b0;endelse beginD <= M_men_D[R_men_addr];K <= M_men_K[R_men_addr];R_data_valid <= 1'b1;R_men_addr <= R_men_addr + 1;end
endalways@(posedge I_clk or negedge I_rst_n) beginif(!I_rst_n)R_data_valid_t <= 1'b0;elseR_data_valid_t <= R_data_valid;
endinteger fid;
initial beginfid = $fopen("D:/job/signed_cal/s_vivado.txt" , "w");if(!fid) begin$display("**************************Can Not Open File**************");$finish;endelse begin$display("**************************Open File Sucess****************");end
end

matlab程序

clear
clc
data_length = 4096 - 8 ; % 定义数据长度,其中排除8种边界条件D_min = 0 ;             %D的数据格式为U80,所以它的最小值为0
D_max = 2^8-1 ;    %a的数据格式为16Q14,所以它的最大值为2 - 1/(2^14)K_min = -4 ;            %b的数据格式为13Q10,所以它的最小值为-2^(13-10-1)
K_max = 4 - 1/(2^10) ;    %b的数据格式为13Q10,所以它的最大值为2^(13-10-1) - 1/(2^10)% 产生4088个均匀分布在a、b、c最大值与最小值之间的随机数
D_rand = D_min + (D_max - D_min)*rand(1,data_length) ;
K_rand = K_min + (K_max - K_min)*rand(1,data_length) ;% 产生8种边界条件
K_boundary = [K_min K_min K_min K_min K_max K_max K_max K_max] ;
D_boundary = [D_min D_min D_max D_max D_min D_min D_max D_max] ;% 随机数与边界值组合成为待量化的数据
K = [K_boundary K_rand];
D = [D_boundary D_rand];% 定义量化规则,根据题目要求量化需采用四舍五入与饱和截位的方式
quan_13Q10_pattern = quantizer('fixed','round','saturate',[13,10]);
quan_U8Q0_pattern = quantizer('ufixed','round','saturate',[8,0]);% 把a、b、c三个数据按照要求进行量化
K_13Q10 = quantize(quan_13Q10_pattern,K);
D_U8Q0 = quantize(quan_U8Q0_pattern,D);% 计算Q = K *(D-16)的值
s0 = D_U8Q0 - 16;
s = K_13Q10 .* s0;% 根据题目要求,s的数据格式为16Q14,所以这里把s量化为16Q14格式的数据
s_U8Q0 = quantize(quan_U8Q0_pattern,s);% 把量化后的a、b、c变成整数方便写入.txt文件中
D_integer = D_U8Q0 ;
K_integer = K_13Q10 * 2^10 ;
s_integer = s_U8Q0 ;% 由于在Verilog中测试激励文件的系统调用$readmemh读入的数据格式为16进制,所以
% 把数据写入.txt文件中之前需要把数据转化为补码的格式,这样负数才不会写错
K_complement = zeros(1,length(K_integer));% 把量化后的a转化为补码
for i = 1:length(K_complement)if(K_integer(i) < 0)K_complement(i) = 2^13 + K_integer(i) ;elseK_complement(i) = K_integer(i) ;end
end% 把量化后的a的补码写入txt文件
fid_a = fopen('K_13Q10.txt','w');
fprintf(fid_a, '%x\n', K_complement);
fclose(fid_a);% 把量化后的b的补码写入txt文件
fid_b = fopen('D_U8Q0.txt','w');
fprintf(fid_b, '%x\n', D_integer);
fclose(fid_b);

存疑:
Q1及之前都是有符号数表示,有符号数怎么转成无符号数?

最后的无符号表示应为啥样的?不太清楚。

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

  1. Verilog有符号数运算

    在数字电路中,出于应用的需要,我们可以使用无符号数,即包括0及整数的集合:也可以使用有符号数,即包括0和正负数的集合.在更加复杂的系统中,也许这两种类型的数,我们都会用到. 有符号数通常以2的补码形式 ...

  2. verilog中有符号数运算

    verilog中的有符号数运算 有符号数的计算:若有需要关于有号数的计算,应当利用Verilog 2001所提供的signed及$signed()机制. Ex: input signed [7:0] ...

  3. Verilog有符号数与无符号数的相互转化

    Verilog有符号数与无符号数的相互转化 最近在使用DA转换时碰到一个问题,DA芯片输入的数值必须是正的,但输出的数据为有符号数,涉及到一个转化的问题,写一篇博客总结一下. 问题描述 一.正数 二. ...

  4. 对verilog中有符号数和无符号数的理解

    文章目录 对verilog中有符号数和无符号数的理解 对verilog中有符号数和无符号数的理解 ​ verilog中使用signed表示有符号数,比如: wire signed [7:0] din; ...

  5. verilog有符号数加减法----正负128

    目录 1. 加运算,+128或者+(-128) 1)输入信号为8位有符号数 2)输入信号为9位有符号数 2. 减法运算,-128或者-(-128) 1)输入信号为8位有符号数 2)输入信号为9位有符号 ...

  6. verilog有符号数使用方法简介

    参考: https://www.cnblogs.com/yuandonghua/p/signed.html https://blog.csdn.net/a389085918/article/detai ...

  7. 无符号、有符号数运算判溢出

    目录 无符号数的运算(溢出看CF) 有符号数运算(溢出看OF)(都是补码进行运算,因为补码的符号位可以直接参与运算一套电路就ok) 例题 第一题 第二题 无符号数的运算(溢出看CF) (1)两个无符号 ...

  8. verilog - signed 符号数与无符号

    #verilog #FPGA verilog - signed 符号数与无符号数计算 文章目录 verilog - signed 符号数与无符号数计算 原码 .反码 . 补码的关系 verilog 中 ...

  9. verilog有符号数和无符号数的计算

    有符号和无符号数 在电路设计中肯定会使用到有符号数无符号数的运算,今天简单说说具体怎么使用有符号数无符号数进行运算,这里以减法为例. 我们知道计算机运算都是以二进制的形式进行的,不过遇到负数,通常用二 ...

最新文章

  1. linux输出重定向%3e退出,Linux学习笔记——第二章:Linux的用户接口与文本编辑器...
  2. 计算机网络总结:第二章 应用层
  3. Visual Studio Code支持JUnit
  4. 天空的颜色和大气散射
  5. 详解OTT与IPTV的不同之处
  6. android应用开发全程实录-你有多熟悉listview? .
  7. idea全局主题_IntelliJ IDEA好看的主题设置(支持自定义)
  8. c语言flag,flag是什么意思
  9. 想要玩转数字影音?可以找Adobe帮忙呀
  10. MySQL数据库实现主从同步
  11. html5生成excel,H5纯前端生成Excel表格
  12. java中整数的整数次方_数值的整数次方
  13. Audition Au制作左右双声道以及导出
  14. Kernel 启动流程梳理
  15. 【原】Oracle 11.2.0.1 64bit for RHEL6.0 Server x86_64 静默安装
  16. caffe把数据转化为lmdb格式zxw.sh
  17. Event Loop 原来是这么回事
  18. 填补行业空白《数据中心机房搬迁实用指南》发布会成功举办
  19. 国庆节加班吗?程序员:看天意
  20. 江西省政府及教育系统领导考察鹰潭“专递课堂”

热门文章

  1. offsetLeft在各浏览器的值
  2. 递归算法(图文详解)
  3. ABAP-HTTP发送JSON
  4. kindeditor 加载 html,kindeditor配置
  5. 简述大型软件系统的测试步骤,软件测试技术.ppt
  6. 4个永久关闭电脑弹窗的方法,99%的人都不知道!
  7. Check Point 收购 Avanan,重塑云电子邮件和协作安全性
  8. Halcon: connection()算子简介
  9. 【不求甚解之UI篇】毛玻璃效果
  10. MySQL数据库学习(二) MySQL数据库课后练习(1) DDL与DML练习