求助:定点实数乘法的FPGA实现

2019-03-25 10:36发布

本帖最后由 nos001 于 2016-9-11 16:03 编辑

这个边沿捕捉是用来测算交流波形周期时间的,用的是CCP3引脚,PIC24F16KL402的捕捉设置非常简单,就只有CCP3CON控制寄存器需要设置,电平变化相关的功能默认都是关闭的,所以不存在设置上的问题。只要将CCP3捕捉关闭就再也不会出现“非法操作码”复位,用示波器看过波形,边沿很陡峭光滑的,现在由于老是复位无法投入使用,很抓狂啊。波形输入硬件电路如下:

ccp3.png
  1. void CCP3_Init(void)
  2. {
  3.     TRISAbits.TRISA7 = 1;
  4.     CCP3CONbits.CCPM = 4;     //下降沿捕捉
  5.     CCPTMRS0bits.C3TSEL0 = 0;
  6.     IFS1bits.CCP3IF = 0;
  7.     IEC1bits.CCP3IE = 1;
  8.     g_SampleState = FREE;
  9.     g_CycleSampleFullMsg = 0;
  10.     g_ADC_BufInx = 0;
  11. }
复制代码

捕捉中断
  1. /***************************************************************************************************************
  2. * 模 块:过零捕捉
  3. * 参 数:无
  4. * 返 回:无
  5. * 说 明:交流过零检测口在CCP3脚,过零加测电路采用交流悬浮衰减直入比较器翻转,2个上升沿之间的TMR1值相减就是波形周期时间。
  6. *        ADC1由T1定时比较触发转换,PR1取值决定采样点之间的间隔时间,PR1的取值计算:
  7. *        SAMPLE_POINTS = 32
  8. *        波形周期 CycleTime = TMR1 * Tcy * 8
  9. *        则有     PR1 = TMR1 * Tcy * 8 / Tcy / SAMPLE_POINTS = TMR1 * 8 / 32;
  10. **************************************************************************************************************/
  11. void __attribute__((interrupt, shadow,no_auto_psv)) _CCP3Interrupt(void)
  12. {
  13.     static UINT8 IntoTimes = 0;
  14.    
  15.     IFS1bits.CCP3IF = 0;
  16.     if ( IntoTimes == 0 )         // 第一个上升沿
  17.     {
  18.         IntoTimes = 1;
  19.         T1CONbits.TON = 0;
  20.         T1CONbits.TCKPS = 0b01;   // 计算波形周期时,预分频1:8
  21.         PR1 = 65000;
  22.         TMR1 = 0;
  23.         T1CONbits.TON = 1;   
  24.     }
  25.     else if ( IntoTimes == 1)     // 第二个上升沿,根据所得波形周期和采样点数算出采样间隔,ADC采样转换开始   
  26.     {
  27.         IntoTimes = 0;
  28.         T1CONbits.TON = 0;
  29.         T1CONbits.TCKPS = 0b00;   // 计算ADC采样间隔时,预分频1:1
  30.         /* PR1 = CycleTime / SAMPLE_POINTS = TMR1 * Tcy * 8 / Tcy / SAMPLE_POINTS = TMR1 * 8 / 32 */
  31.         PR1 = TMR1 >> 2;               
  32.         TMR1 = 0;               
  33.         T1CONbits.TON = 1;
  34.         IEC0bits.AD1IE = 1;
  35.         AD1CON1bits.ADON = 1;     // 打开AD模块
  36.         g_ADC_BufInx = 0;         // 缓存清空
  37.         g_SampleState = BUSY;     
  38.         IEC1bits.CCP3IE = 0;
  39.         CCP3CONbits.CCPM = 0;     // 关闭CCP3捕捉
  40.     }
  41. }
复制代码 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
eeleader
1楼-- · 2019-03-25 13:23
< /

直接把小数放大成整数,然后进行相乘,然后缩小,这样处理完全能满足常用的数字处理。

不需要你这么复杂。

 

对了,如果只是实现乘法运算,是没有必要用MODESIM仿真哦,问题比较简单,实现也不难

wang182004
2楼-- · 2019-03-25 17:26

原帖由 eeleader 于 2010-7-30 12:28 发表 直接把小数放大成整数,然后进行相乘,然后缩小,这样处理完全能满足常用的数字处理。不需要你这么复杂。   对了,如果只是实现乘法运算,是没有必要用MODESIM仿真哦,问题比较简单,实现也不难!

 

 

          谢谢,这个思路跟我所述差不多。我要做的是一个复矩阵求逆的模块,所以我想先保证每个模块的正确,所以想乘法也用MODERSIM反正下。

          我还存在的问题是:

       (1)因为我们要处理实数,即使我们在编功能模块的时候可以直接对输入进行移位放大,但是我们要仿真的话肯定要输入真实的实 数,但MODERSIM 却不能识别实数,这个该怎么处理。

        (2)因为我最终是要实现MIMO系统的检测,所以还是要做定点处理的1+5+11,1是符号位,5是整数部分,11是小数,这样的话整个模块才能统一, 所以底层乘法模块也得这样,看起来可能复杂点,版主还有什么更好的办法请指教下哈。。。?

[ 本帖最后由 wang182004 于 2010-7-31 20:15 编辑 ]
wang182004
3楼-- · 2019-03-25 19:42
 精彩回答 2  元偷偷看……
wang182004
4楼-- · 2019-03-26 00:58
怎么没人说话了哈,,,我的问题还没解决的嘛,,,:(

一周热门 更多>