17.定浮点数与有符号数

定点数

  FPGA中运算效率最高的就是截位,其次乘法也可以用DSP单元进行实现。所以除以一个数经常先乘以一个较大的数据然后做截位操作。比如在均值滤波的时候,需要除以9,这时候就可以先乘以7281,然后除以 2 16 2^{16} 216次方。可以近似等价于除以9

有符号数

  FPGA中的数据运算经常涉及到有符号数据。

module signed_calcu(

);
/*******************************************************************/
wire    [7:0]   a1          ;
wire    [7:0]   b1          ;

wire    [8:0]   c1_add      ;   //两数相加   最大位宽加1
wire    [15:0]  c1_mult     ;   //两数相乘   最大位宽相加

assign  a1  =   26      ;
assign  b1  =   105     ;

assign  c1_add      =   a1  + b1    ;
assign  c1_mult     =   a1  * b1    ;


/*******************************************************************/ 
wire    [7:0]   a2          ;
wire    [7:0]   b2          ;

wire    [8:0]   a2_s        ;
wire    [8:0]   b2_s        ;

wire    [8:0]   c2_add1     ;
wire    [8:0]   c2_add2     ;

wire    [15:0]  c2_mult1    ;
wire    [15:0]  c2_mult2    ;

assign  a2  =   -40     ;
assign  b2  =   200     ;

assign  a2_s    =   $signed (a2     ) ;  //使用系统函数将数据转化为有符号数
assign  a2_s    =   $signed (1'b0,b2) ;  //使用系统函数将数据转化为有符号数

assign  c2_add1     =   a2 + b2     ;   //不使用系统函数直接相加
assign  c2_add1     =   $signed(a2)     +   $signed({1'b0,b2});     //使用系统函数相加

assign  c2_mult1    =   a2 * b2     ;   //不使用系统函数相乘
assign  c2_mult2    =   $signed(a2) * $signed({1'b0,b2});  //

/*
    signed  系统函数会将数据的最高位复制下来放到最前面,他是不能直接识别真负数的
    如果不用系统函数,在verilog里面直接写负数会将其补码视为无符号整数,如 -40会被看作 216

*/

/*******************************************************************/ 
wire    [7:0]   a3          ;
wire    [7:0]   b3          ;

wire    [8:0]   a3_s        ;
wire    [8:0]   b3_s        ;

wire    [8:0]   c3_add1     ;
wire    [8:0]   c3_add2     ;

wire    [15:0]  c3_mult1    ;
wire    [15:0]  c3_mult2    ;

assign  a3  =   -40     ;
assign  b3  =   -200    ;

assign  a3_s    =   $signed (1'b0,a3) ;  //使用系统函数将数据转化为有符号数
assign  a3_s    =   $signed (1'b0,b3) ;  //使用系统函数将数据转化为有符号数

assign  c3_add1     =   a3 + b3     ;   //不使用系统函数直接相加
assign  c3_add1     =   $signed (1'b0,a3)     +   $signed({1'b0,b2});     //使用系统函数相加

assign  c2_mult1    =   a2 * b2     ;   //不使用系统函数相乘
assign  c2_mult2    =   $signed (1'b0,a3) * $signed({1'b0,b2});  //使用系统函数相乘


endmodule 




endmodule
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一单元:计算机应用基础练习题 一、问答题 1.如何理解计算机文化是人类的第二文化? 2.计算机是一种什么样的设备,为什么说计算机的普及是一个国家现代化的重要标志 ? 3.从世界上第一台电子计算机诞生到现在,电子计算机的发展已经历了哪几个阶段( 或称几代),微型计算机的发展又经历了哪几个阶段? 4.请说明微处理器、微型计算机、微型计算机系统的区别。什么叫单片机、单板机? 5.电子计算机作为一种计算和处理信息的设备具有哪些特点,微型计算机除具有计算 机的一般特点外,又具有哪些特点? 6.电子计算机主要有哪些应用领域? 7.计算机的主要性能指标是什么?试举出一种实际的计算机为例加以说明。 8.解释下列名词术语的概念: 字长 位 字 字节 主频 存储容量 存取周期 地址 9.用8位二进制表示一个带符号的整,用原码、补码和反码表示时,其所表示的 范围各为多少? 10.何谓,何谓浮点数,为什么浮点数的表示范围比大? 11.什么是补码、反码,如何求一个二进制的补码,试求下列各二进制的补码? 0.11001 -0.11001 0.00001 -0.00001 0.11111 -0.11111 12.在计算机中,字符是怎样表示的,汉字又是怎样表示的? 13.计算机系统包括哪些内容,计算机硬件系统又包括哪些? 14.试区分主机、CPU、计算机及计算机系统的区别。 15.试说明运算器、控制器、存储器的功能。 16.输入输出设备和通常所说的外部设备有什么不同? 17.一台微型计算机其硬件的基本配置应是怎样的? 18.显示器的主要指标是什么? 19.打印机如何分类,LQ-1600K是什么类型的打印机,如何正确使用? 20.磁盘存储器由哪几部分组成,软盘的存储容量是怎样计算的? 21.什么是系统软件,什么是应用软件,举例说明。 22.用机器语言、汇编语言、高级语言分别编写的源程序如何在机器上运行? 23.保护计算机软件知识产权有什么重要意义? 24.影响计算机信息安全的主要危害是什么,什么是"黑客"? 25.什么是计算机病毒,有什么危害,计算机病毒有哪几种,应该如何正确对待计算 机病毒的流行和危害? 26.什么叫多媒体,多媒体技术有些什么特点? 27.什么样的计算机是多媒体计算机,多媒体计算机的关键技术是什么? 二、判断题 1. 在微型计算机广阔的应用领域中,会计电算化属于科学计算应用方面。 2. 兼容性是计算机的一个重要性能,通常是指向上兼容,即旧型号计算机的软件可 以不加修改地在新型号计算机上运行,系列机通常具有这种兼容性。 3. 决计算机计算精度的主要技术指标是计算机的字长。 4. 计算机的"运算速度"的含义是指每秒钟能执行多少条操作系统的命令。 5. 利用大规模集成电路技术把计算机的运算部件和控制部件做在一块集成电路芯片 上,这样的一块芯片叫做单片机。 6. 计算机的主机由运算器、控制器和计算机软件组成的。 7. 半导体存储器ROM是一种易失性存储器件,电源关掉后,存储在其中的信息便丢失。 8. 在计算机中之所以采用二进制是因为二进制的运算最简单。 9. 从计算机诞生起,科学计算一直是其最主要的应用方面。 10. 存储地址是存储器存储单元的编号,CPU要存取某个存储单元的信息,一要知道这个存 储单元的地址,并通过地址线中的地址信号去找到这个地址单元。 11. 计算机的硬件和软件是互相依存、互相支持的,硬件的某些功能可以用软件来完成,而 软件的某些功能也可以用硬件来实现。 12. 从信息的输入输出的角度来说,磁盘驱动器和磁带机既可以看作输入设备,又可以看作 输出设备。 13. 运算器是计算机的一个主要组成部件,其主要功能是进行算术运算和逻辑运算,它又叫 CPU(中央处理器)。 14. 外存储器(如磁盘)上的信息可以直接进入CPU被处理。 15. 磁盘必须经过格式化后才能使用,凡格式化过的磁盘都能在各种型号的微型计算机上使 用。 16. 键盘和显示器都是计算机的I/O设备,键盘是输入设备,显示器是输出设备。 17. 打印机按印字方式可以分为击打式打印机和非击打式打印机两大类,点阵针式打印机和 激光打印机都属于击打式打印机。 18. 计算机区别于其他计算工具的本质特点是能存储据和程序。 19. 显示器的一项重要性能指标"点距"是指显示器屏幕上两个相邻光点之间的距离。 三、单选题 1. 1946年2月,在美国诞生了世界上第一台计算机,它的名字叫 。 A.EDVAC B.EDSAC C.ENIAC D.UNIVAC-I 2. 在计算机技术中采用二进制,其主要原因是 。 A.由计算机电路所采用的器件决的,计算机采用了具有两种稳状态的二值电路 B.二进制运算最简单 C.二进制表示简单,学习容易 D.最早设计计算机的人随意决
### 回答1: 在C语言中,我们可以通过使用特的格式规范符来实现双精度浮点数和十六进制之间的转换。 如果我们有一个十六进制,我们可以使用"0x"前缀来表示它是一个十六进制值。例如,0x3F800000代表了双精度浮点数1.0。 如果我们要把一个双精度浮点数转换成十六进制,我们可以使用"%a"格式规范符。例如: ```c double num = 1.0; char hex[20]; sprintf(hex, "%a", num); printf("十六进制表示:%s\n", hex); ``` 这样我们就可以得到双精度浮点数1.0对应的十六进制"0x1.0p+0"。 另外,如果我们要把一个十六进制转换成双精度浮点数,我们可以使用"%lf"格式规范符。例如: ```c char* hex = "0x3F800000"; double num; sscanf(hex, "%lf", &num); printf("双精度浮点数:%lf\n", num); ``` 这样我们就可以得到十六进制"0x3F800000"对应的双精度浮点数1.0。 需要注意的是,双精度浮点数的精度要比十六进制高,因此在转换时可能会存在一的精度损失。同时,在进行转换时,我们也需要确保十六进制字符串的格式是正确的,否则可能会得到错误的结果。 ### 回答2: 双精度浮点数与十六进制在C语言中的相互转换可以通过联合体或指针来实现。 首先,如果需要将双精度浮点数转换为十六进制,可以使用联合体的方法。联合体是一种特殊的据类型,它的所有成员共享同一块内存空间,可以根据需要以不同的方式解释这块内存。示例如下: ```c #include <stdio.h> union DoubleToHex { double d; unsigned long long hex; }; int main() { double num = 3.14; union DoubleToHex converter; converter.d = num; printf("双精度浮点数 %lf 的十六进制表示为 %llx\n", num, converter.hex); return 0; } ``` 在这个示例中,我们义了一个联合体`DoubleToHex`,它包含了一个双精度浮点数`d`和一个无符号长整型整`hex`。首先将要转换的双精度浮点数赋值给`d`,然后通过`hex`成员可以获取该双精度浮点数的十六进制表示。 如果需要将十六进制转换为双精度浮点数,可以使用指针的方法。示例如下: ```c #include <stdio.h> int main() { unsigned long long hex = 0x400921fb54442d18; double *p = (double *)&hex; double num = *p; printf("十六进制 %llx 的双精度浮点数表示为 %lf\n", hex, num); return 0; } ``` 在这个示例中,我们先义了一个十六进制`hex`,然后通过将其地址强制转换为`double`类型的指针`p`,再通过解引用`p`获取到双精度浮点数的值。 通过使用联合体或指针,可以实现双精度浮点数与十六进制在C语言中的相互转换。 ### 回答3: 双精度浮点数和十六进制在C语言中可以相互转换。下面是双精度浮点数转换为十六进制的方法: 首先,将双精度浮点数的二进制表示转换为十六进制。双精度浮点数符号位、指位和尾位组成,一般为64位。 1. 获取双精度浮点数符号位:根据浮点数的最高位判断,0表示正,1表示负。 2. 获取指位并转换为十进制:指位一般占用11位,但是由于指位是以偏移方式存储的,需要减去一个偏移量(1023),得到真正的指值。 3. 获取尾位的小部分,并在开头加上一个隐含的二进制1:尾位一般占用52位,为了方便计算,需要在尾位最高位加上一个隐含的1。 4. 将小部分转换为十六进制:将小部分乘以16,得到新的小和整部分,将整部分转换为十六进制,将小部分继续乘以16,得到新的小和整部分,依次进行直到小部分为0或达到所需的精度。 以上就是将双精度浮点数转换为十六进制的过程。 而如果要将十六进制转换为双精度浮点数,则需要反过来进行操作: 1. 将十六进制转换为二进制:将十六进制的每一位转换为对应的4位二进制。 2. 将二进制位分为符号位、指位和尾位:根据浮点数的位每一部分的长度。 3. 将指位转换为十进制,并加上一个偏移量:和双精度浮点数转换为十六进制的过程类似,需要还原指的真正值。 4. 将尾位转化为小部分,并去除隐含的1:根据尾的长度,将二进制转换为小,然后去除开头的隐含的1。 5. 根据符号位确浮点数的正负性。 以上是将十六进制转换为双精度浮点数的过程。 通过以上步骤,我们可以在C语言中实现双精度浮点数和十六进制之间的转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值