coscord index.php,FPGA利用cordix产生三角函数图形

之前,利用cordix原理,用来实现计算三角函数的值。突发奇想,既然能计算每个三角函数的值,那就可以让输入的值,不断的自增,那输出的结果不就是三角函数的图像了。

想到了,就开始写程序实现了。其实只要编写测试文件,让输入的值,一直加一就可以了。但是利用迭加的原理,输入的角度范围,为-90°到90°。

以下是写好的测试代码的核心部分:

always #5 clk =

~clk;

reg [7:0] i;

initial begin

// Initialize Inputs

clk = 0;

phi = 0;

while(1)

begin

for(i=0;i<=84;i=i+1)

begin

@(negedge clk)

phi = (phi + (1<<8));

end

for(i=84;i>=10;i=i-1)

begin

@(negedge clk)

phi = (phi - (1<<8));

end

end

end

利用modelsim仿真。因为modelsin可以将数据改成模拟数据显示。

b756db2005ec5f513ffff3332f1dada3.png

从仿真图中,可看出,输出的波形的样子很像是三角函数的波形。但是发现,中间会莫名奇妙出现一些很大的负值。这当然就不对了,就说明写的程序有问题。

发现问题了,然后就要去找问题,看问题是出在什么地方了:

用ISE的自带仿真ISIM观察波形:

26736e9f2dcd74f106a8a4673d72b40b.png

30144d15f1ec8ed323b2d68309a710c6.png

从输出cos和sin的值第一次变成负数分析:

从图中,可看出,当输入角度大于22016(86°)输出的值就开始不正确了,而且输出的是负值。开始研究输入的值为86的中间迭代过程的值。

首先,从图中可看出,

X0

= 39797       y0 = 0          z0 = 22013

X1

= 39797       y1 = 39797      z1 = 10496

X2

= 19899       y2 = 59695      z2 = 3697

X3

= 4975        y3 = 64669      z3 = 103

X4

= -3107       y4= 65291       z4 = -1722

X5

= 623         y5 = -58832     z5 = -805

就从这几个数据,就感觉从第五次迭代就有问题了。怎么会出现这么大的负值了。

开始计算每个值

按照伪代码

当z>0  x[i+1] =

x[i] - y[i]*2^(-i)

y[i+1] = y[i] +

x[i]*2^(-i)

否则x[i+1] = x[i]

+ y[i]*2^(-i)

y[i+1] = y[i] - x[i]*2^(-i)

这里就不计算z的值了。但是要考虑Z的符号,从图中,看出,当z大于3后,就小于0了。因此迭代第5次的时候,x和y的运算要变号了。

首先x[0] = 39797   y[0] = 0

迭代第一次x[1] = x[0]–y[0]   = 39797

y[1] = y[0] + x[0]   = 39797正确

迭代第二次x[2] = x[1]- y[1]/2 = 19899

y[2] = y[1] + x[0]/2 = 59695正确

迭代第三次x[3] = x[2]- y[2]/4 = 4976

y[3] = y[2] + x[2]/4 = 64669正确

迭代第四次x[4] = x[3]- y[3]/8 =-3107

y[4] = y[3] + x[3]/8 = 65291正确

迭代第五次x[5] = x[4]+ y[4]/16= 973

y[5] = y[4]-x[4]/16  = 65097

从分析迭代第五次结果,就发现,计算出来的值和仿真出来的值不一样。图中,x[5]的值为623,不等于计算出来的973。但是突然发现到,623 = 59695/16-3107也就是x[5]=x[4] + y[2]/16;发现这个后,马上返回程序查看。

if(z[4][N_Z-1])

begin

x[5] = x[4] +

{{4{y[4][W-1]}},y[2][W-1:4]};

y[5] = y[4] - {{4{x[4][W-1]}},x[2][W-1:4]};

z[5] = z[4] + 16'd916;  //3.58° = 0_0000011_10010100 = 916

end

这下,发现错误了。程序中的y[4]写成y[2]了。。真是,找了半天的错误,竟然发现是当初写程序的时候,没注意,一个下标写错了。哎,今天找这错误,找了一下午。所以,各位,以后写程序的时候,要注意这些细节啊。不然,到时候调试错误的时候,很花精力的。

改正后,用ISIM仿真看看结果有没有正确

310a7ff06bbb3e2fa4bdc3f8da7e351b.png

从仿真图中,看出。这下结果正确了。。不容易啊。一个小错误。然后再用modelsim看我们的完美三角波形图。

945961c7e7f03dd268a53d7639fc5214.png

这下,出来的三角函数波形图就完美了。上面余弦,下面是正弦,是不是很酷啊。哈哈

b756db2005ec5f513ffff3332f1dada3.png

30144d15f1ec8ed323b2d68309a710c6.png

26736e9f2dcd74f106a8a4673d72b40b.png

310a7ff06bbb3e2fa4bdc3f8da7e351b.png

945961c7e7f03dd268a53d7639fc5214.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值