← 大华硬件逻辑岗(19.09.25)

推荐答案 测试一下

请用你熟悉的HDL语言,实现算法Q=K*(D-16),其中输入数据D和输出数据Q的数值定义均为无符号8位整数u.8.0(无符号,8位整数,0位小数),输入参数K的数值定位为有符号数小数s.2.10(1位符号位,2位整数位,10位小数位)。…

问答题 中等 经典问答问答题

参考答案

我们分析题目:实现 Q = K * (D - 16),数据类型:D 和 Q 都是无符号8位整数 (u8.0),K 是有符号定点数 s2.10(1位符号,2位整数,10位小数)。要求中间过程保留完整精度,最后四舍五入。 考点:定点数运算、位宽扩展、有符号与无符号混合运算、四舍五入实现。 步骤: 1. 计算 D - 16:D 是 u8.0,16 是常数,结果是带符号数吗?因为 D 可能小于16,所以结果是带符号数。需要将 D 扩展为有符号数(比如9位有符号整数)再进行减法。因为 D 最大255,最小0,减16后范围 -16~239,需要9位有符号(包括符号位)。实际上可以用9位有符号数表示。 2. 乘以 K:K 是 s2.10,即共13位(1符号+2整数+10小数)。乘法时,被乘数(D-16)是9位有符号整数(s9.0),乘数 K 是 s2.10,乘积为 s(9+2+1).(0+10) = s12.10?注意有符号乘法位宽:两个有符号数相乘,位宽为两个数位宽之和。所以乘积位宽:9位有符号 * 13位有符号 = 22位有符号,其中整数部分9+2=11位(含符号),小数部分10位。所以乘积格式 s11.10(1符号+10整数+10小数?不,注意:s2.10 中整数2位含符号?通常说s2.10表示1符号,2整数,10小数,总共13位。那么整数部分实际是2位整数(不包括符号),所以乘积整数部分:被乘数整数位(8位无符号?但D-16是9位有符号,整数部分实际是8位(1符号+8整数?)需要仔细定义:s9.0 表示1符号,8整数,0小数。所以整数位8位。K的整数位2位。乘积整数位8+2=10位,加上符号位1位,共11位整数(含符号),小数位10位。所以乘积是 s11.10(1符号+10整数+10小数),共21位?不对,两个有符号数相乘结果位宽为两个位宽之和,即9+13=22位。其中符号位1位,整数部分 (8+2)=10位,小数部分10位,总共1+10+10=21位?矛盾。实际上s9.0位宽9位:1符号+8整数;s2.10位宽13位:1符号+2整数+10小数;乘积位宽9+13=22位,格式是:1符号+ (8+2)整数+10小数 = 1+10+10=21位,少了1位。这是因为有符号乘法会产生额外的符号扩展?实际上两个有符号数相乘,结果位宽为两个数位宽之和,但符号位只需要1位,所以整数部分为被乘数整数+乘数整数,再加上一个可能的进位?例如两个最大负数相乘会得到更大的正数,但整数部分长度需要增加1位来容纳溢出?在定点乘法中,通常乘积的整数部分位宽为被乘数整数位+乘数整数位+1(两个符号位相乘可能产生进位),或者直接用总位宽减去小数位。更准确:两个有符号数,每个有符号数的符号位算在整数部分里。s9.0:整数部分9位(包括符号),小数0;s2.10:整数部分3位(包括符号),小数10。乘积的整数部分位数为9+3=12位(包括符号),小数10位,总位宽22位。所以乘积格式为 s12.10(1符号+11整数+10小数?12位整数包括符号,所以实际无符号整数部分11位)。为了简化,我们通常用位宽之和,然后指定小数位。所以乘积是22位有符号数,低10位是小数,高12位是整数(含符号)。这样合理。 3. 中间结果保留完整精度:即乘积保留22位。 4. 最后四舍五入到8位无符号整数 Q:Q 是 u8.0,即需要将22位乘积截取为8位,且四舍五入。注意:乘积有小数10位,我们需要对小数部分进行四舍五入到整数。四舍五入方法:看小数部分最高位(第9位小数,因为10位小数,最高位是小数位的最高位,即2^{-1}位)以及更低位。通常四舍五入:加0.5然后截断。对于定点数,加 (1<<(小数位-1)) 然后右移小数位。但需要考虑符号:如果是负数,四舍五入需要处理。由于 K 可能为负,且 D-16 可能为正负,乘积可能为负,但 Q 定义为无符号8位整数,所以负数需要特别处理吗?题目说 Q 是无符号8位整数,如果结果为负数,四舍五入后可能得到0?或者饱和?题目没有说饱和,只要求四舍五入,但负数的四舍五入要小心。例如 -1.5 四舍五入到整数,一般取 -2(向负无穷)还是 -1(远离零)?通常四舍五入是指向最近的整数,如果是负数,也是先按绝对值四舍五入再加符号?但这里最终要输出无符号,所以负数应该被截断为0?或者考虑实际电路不会出现负数?注意:D 范围为0~255,D-16 范围为-16~239,K 是 s2.10,范围大致 -4~3.999,乘积范围可能负,但绝对值可能大,输出无符号,若结果为负,无符号表示如何?可能是取模?不合理。实际上题目可能隐含了结果一定非负?或者要处理饱和?但题目没有明确。通常笔试中,要考虑到有符号乘法和无符号输出的转换,需要做饱和处理或截断。但题目要求“最后四舍五入”,且输出为无符号8位整数,那么如果结果为负数,四舍五入后得到负整数,无

涉及知识点

  • IC 基础
  • 数字电路
  • 设计与验证
← 上一题
登录后反馈错题
下一题 →