微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 一个简单的verilog程序,小数能直接赋值吗

一个简单的verilog程序,小数能直接赋值吗

时间:10-02 整理:3721RD 点击:
module Step_size (h_0,h_1,h_2,h_3,h_4,h_5,enter);
parameter a=0.25;
parameter b=0.125;
parameter c=0.0625;
parameter d=0.03125;
parameter e=0.015625;
parameter f=0.0078125;
output [31:0] h_0,h_1,h_2,h_3,h_4,h_5;
input  [31:0] enter;
reg           h_0,h_1,h_2,h_3,h_4,h_5;
always@(posedge enter)
  begin
    h_0<=a;
    h_1<=b;
    h_2<=c;
    h_3<=d;
    h_4<=e;
    h_5<=f;
   end
endmodule
这个程序能实现吗

小数应该怎么处理啊?求高手指教

网上有很多处理定点数和浮点数的介绍,自己可以搜索看看,一般都是用矢量来表示不同的部分的。

这个应该不行吧

好的,谢谢



   同问?

用的浮点小数格式输入的,不过不知道怎么转化成输出显示成十进制小数

本想用一个ip核仿真试试,结果仿真各种错误,还没解决呢

好樣的!

可以参考一下定点小数的使用方法  可以实现 但是直观上都是整数

之后要用浮点型IP核求指数函数,用定点小数运算要再转成浮点型
在向程序输入数据的时候,是十进制小数,要怎么样识别出这个数,并转成浮点型呢?
求指教

其实这些都是数字处理了,误差是必须引入的,所以可以先把小数乘以二的你想要用的数据位数的这么多次方,比如说想要一个8为的有符号数,可以乘以2的7次方,取其整数部分即可。最好算出来的值就是结果的2的7次方倍,自己后期处理一下就OK了



    没看太懂,是2的想保留的小数位的次方吧,乘之后的这个结果是什么呢,十进制怎么转成二进制呢

12L的意思是指例如你要表示一个0.125,也就是1/8,这样你先把小数扩大2^n倍,当做整数去处理,处理完成之后,然后把处理的结果在除以2^n,就可以了!当然这个过程存在一定的误差,这个误差要能满足你的要求才可以!

二进制都是整数, 加bit width作为小数精度, 比如 8bit 可精确到 (1/2)^8 = .00390625 per bit.

那把小数扩大2^n是我们手算,还是由芯片处理,其实我一直不明白我们在向芯片输入小数时,是以什么形式输入的,最初时是怎么处理的,这点我想了很久都没想通,望大神指教

应该是分成整数部分和小数部分,但同样都是二进制编码,然后需要的时候进行解码

那小数输入时是按两次输入吗,分别经过不同的算法编译成二进制,那这样对于操作的人岂不是很不方便

parameter a=32;
parameter b=16;
parameter c=8;
parameter d=4;
parameter e=2;
parameter f=1;
你完全可以把他们都放大2^n倍的,这样处理就比较简单

同问。

那不很容易溢出吗

电路中都是0和1的序列 ,它是不会知道这是小数还是整数的。  
所以如果要处理小数,可以先对小数进行操作:比如0.25*2^8=100000000 ;
0.125*2^8=100000。
注意:1.这里前后两个数位数不同,所以扩展成相同的就可以了;2.这是原码,一般来说是处理成补码,正负也好加减;3.如果a*2^8后还是小数,就要截取或者round,这会引入误差。
总结: 对小数进行a*2^n的操作,自己心中知道数值变化,当输入结果到(比如matlab)后,再相应的操作就可以了

可在最初时,比如2.5,乘2后为5,但这个乘2的过程是移位吗,那个2.5在乘之前怎么表示

IEEE754标准



    有个统一标准,IEEE754!这是一个二进制浮点数体系,貌似是各种数学家、科学家、工程师合作十年的结晶 ,1985年被IEEE标准委员会和美国国家标准局采纳……
    Altera的浮点数运算IP核都是采用这个标准,所以要按IEEE754标准来看那个仿真数据!

还不错。

IEEE754标准看了,但最初时,这个数值能按照这个标准输入吗,在输入之前要进行计算,这个计算的过程在哪实现,在FPGA上吗,若在FPGA上,计算之前的那个数又怎么输呢。
这个弯我就是转不过去



    我一般用nios II里的C语言实现这个转换,C语言里是可以自动转换的,可以用联合体实现!转换后再送到FPGA,计算后再送回nios转换!
#include "stdio.h"
typedef union test1 //IEEE-754 Floating-Point Conversion 32
{        
   unsigned int intData; //unsigned int为两个字节,可以直接用于表示32位
   float floatData;
}Float_32;
typedef union test2 //IEEE-754 Floating-Point Conversion 64
{        
   unsigned char intData[8]; //unsigned char为一个字节,8个unsigned char表示64位
   double doubleData;
}Float_64;
void main()
{
Float_32 temp1;
Float_64 temp2;
int i;
temp1.floatData = 1.23456;
temp2.doubleData = 1.23456;
printf("%x\n",temp1.intData);
for(i=7;i>=0;i--){
  printf("%x",temp2.intData);
}
printf("\n");
}

可以先给他放大,计算完,在缩小回来!

c语言忘得差不多了,看不大懂
我用verilog编了个整数转化为浮点小数的程序,小数的不知怎么编,
是放大2^n之后把其整数部分输入FPGA中,转化为浮点小数,再缩小2^(-n)?
那如果本来那个数就已经接近溢出了,放大的话不是一定溢出吗,这时是要把小数直接舍弃吗?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top