计算模块分析

模块需要实现的功能:1、实现原始深度计算:五个输入、一个输出值和一个输出使能信号;

                                    2、计算幅度值(这个功能是一个使能控制的)这个的话就是一个行结束信号和一个行输出使能信号;

                                    3、需要告诉相连的模块什么时候开始计算,什么时候算完了一行,什么时候算完了一帧;

                                    4、需要对计算出来的振幅值做一个判断。

首先怎么计算核心公式:atan 。这个采用的方法是 根据判断两两相减的数据组合的坐标在哪个象限,然后根据边转边加的方式将其代换到第一象限的0-45°之间,后面就根据他们两个的商进行查找。(这里调用IP哎)

第一步,定义一些设计中需要用到的参数。比如:MAX_DIST_VALUE、LOW_AMPLITUDE、MODULO_SHIFT、MODULO_SHIFT_PI=MAX_DIST_VALUE/2+MODULO_SHIFT.

第二步,设计一个开始计算的信号cal_start 当cal_start信号为高时,开始计算,对灰度进行一个处理(减去2048除以259,除法用移位来实现,即右移九位),同时设计一个计数器,在cal_start为高时,对每一个clk上升沿计数,否则,相应的所有信号都让其为低。设计一个embient_com_en,当这个信号为控制是否进行振幅校正,当期为高时,就对其进行校正,如果不为高,就不进行振幅校正。无符正整数变有符正整数,$signed({1'b0,dcs_do});

cal_start为高时,计算sqrt_i=x*x+y*y;这段代码应该是可以优化的,定义寄存器,减小组合逻辑延时。

设计一个状态机,分别是初始状态,开始工作,计算三个状态。

   这三个状态产生控制信号,hsync_start 、cal_start 和line_end信号                        

前级模块输入cache_ready,当这个信号为高时,hsync_start信号为高,进入start状态,start状态下,cal_start信号拉高,如果atan_value信号为高就进入CALING状态  ,CALING状态下,如果pixel_cnt记到318,就令line_end信号为高,hsync_start信号拉低。当记到329的时候状态条回到IDLE信号。             

原文地址:https://www.cnblogs.com/mebey/p/9414258.html