bob_lee 发表于 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

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

hughqfb 发表于 2013-6-11 20:44:08

”这种乘法感觉不能在一个边沿触发下完成。虽然程序编译通过,功能老实说也基本出来了,但是有不稳定情况。“

这个我个人感觉要用锁存器,设定一个标志位flag,乘法完成后便设置标志位等等。。。
页: [1]
查看完整版本: 求各路高人给点指示,乘法在状态机里到底该怎么用啊?