搜索
bottom↓
回复: 1

求各路高人给点指示,乘法在状态机里到底该怎么用啊?

[复制链接]

出0入0汤圆

发表于 2013-6-11 17:44:21 | 显示全部楼层 |阅读模式
最近小弟在做led显示屏的图像输出,之前都是用ARM做图像的静态,左移,右移,上移下移。最近想在FPGA上实现,且不用软核。我大概说下思路,就是根据不同指令进入不同的状态机实现不同的移动特效。所以大的状态机有   静态,左移,右移,上移下移。但是发现一个问题,用C写两幅图像移动,可以用乘法来计算坐标,从不同地址取不同图像的值。但是用FPGA,且在状态机里用乘法,始终感觉不靠谱,因为地址都是19位的长度。这种乘法感觉不能在一个边沿触发下完成。虽然程序编译通过,功能老实说也基本出来了,但是有不稳定情况。比如状态机会出现死机进入不存在的状态。或者图像正常的左移突然会闪一下另一幅图。然后又正常等等。后来发现状态机的稳定性太差,怀疑跟我用一段式写有关系,还更乘法运算有关系。但是不知道怎么改比较好,尤其是要用乘法来求坐标啥的。下面贴两段代码,一个是状态机的跳变,一个是静态的算法,比较简单的,请各位大婶能给点意见。

S4: begin       //状态装异,但用逻辑分析仪发现,有时候状态就是进入到不存在的状态。没有正确运行,还以跟后面的运算太繁琐有关,不是算法烦,小弟技术还没到那地步,怀疑是乘法的问题。
                led<=~led;
                if(phy_tx_over==0) begin
                    case(dsp_cmd)
                        8'h01:begin data_avlid <=1;cstate <=S3;end//静态
                        8'h02:cstate <=S6;//上移
                        8'h03:cstate <=S7;//下移
                        8'h04:cstate <=S4_1;//左移
                        8'h05:cstate <=S5;//右移
                        //8'h17:cstate <=S8;//闪烁
                        default:cstate <=S3;
                    endcase                  
                end
                else begin
                    cstate <=S4;
                end
            end


S3: begin       //静态操作
                led<=~led;
                phy_tx_start<=1;//开始写fifo
                din<=data_d & 8'b10101000;
                addr_d<=addr_d+19'h00001;//赋的地址值是下个数据的地址,故din<=data_d;读取的是上次地址内的值,
                cnt_p<=cnt_p+16'h0001;
                cstate <=S3;
                if(cnt_p==cnt_h*w+(w-1))begin
                    cnt_p<=cnt_h*w+w;//下一行点数计数初始值
                    cnt_h<=cnt_h+16'h0001;//切换到下一行
                    cstate <=S3;
                    addr_d<=(cnt_h*w+w)+19'h00009;//下行起始地址
                    if(cnt_h==h-1 && cnt_p==cnt_h*w+w-1)begin//一帧的最后一行的最后一个点
                        cnt_h<=0;
                        cnt_p<=0;
                        addr_d<=0;  //2图的第一行最后一个点
                        //转移到下个状态开始读取指令部分
                        cmd_addr<=0;//从0地址一次把cmd读取走
                        cmd_avlid<=1;
                        cstate <=S10;//S10是个过度状态,最后又回到S4来判断下个指令到底要做  静态,左移,右移,上移下移。
                    end
                    else;
                end
                else;
            end

请大神们多点耐心给小弟点指点意见。最近发现国内的资料书都是一样的套路,看来看去都没发现什么有亮点的。 很少有提到乘法* 到底该怎么用在时序电路上。毕竟调用乘法器还要有时钟呢,何况一个状态下怎么能一下成功。我自己都怀疑。本人在南京,如果有高人的话,小弟想去拜访下。真心想做点有意义的设计提升自己的能力。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-6-11 20:44:08 | 显示全部楼层
”这种乘法感觉不能在一个边沿触发下完成。虽然程序编译通过,功能老实说也基本出来了,但是有不稳定情况。“

这个我个人感觉要用锁存器,设定一个标志位flag,乘法完成后便设置标志位等等。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 05:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表