打印

程序有虫子,求大家帮忙找找(状态机部分)

[复制链接]
1179|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
静默雪原|  楼主 | 2013-1-9 12:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
module state(clk,rst,cnt,SH,F1);

input clk; //12M
input rst;
input[7:0] cnt;

output SH,F1;

reg       SH,F1;
reg [3:0] CS,NS;
reg [3:0] cnt1; //对12M计数,循环100

parameter   IDLE =4'b0001,
                  SHIFT=4'b0010,
                  HIGH =4'b0100,
                  LOOP =4'b1000;

always@(posedge clk or negedge rst)
        if(!rst)
                CS<=IDLE;
        else
                CS<=NS;

always@(cnt,CS)
        begin
                NS<=IDLE;
               
                case(CS)
                        IDLE:
                                begin
                                        if(cnt>0 && cnt<18)   
                                                NS=SHIFT;
                                        else
                                                NS=IDLE;
                                end
                               
                        SHIFT:  
                                begin
                                        if(cnt>17 && cnt<24)   //发现HIGH状态第一次持续6个cnt,后面6--12个cnt不等 不知道怎么回事
                                                NS=HIGH;
                                        else
                                                NS=SHIFT;
                                end
                               
                        HIGH:   //这里有问题 发现cnt>23后几个时钟周期内,状态还在HIGH,没能转到LOOP
                                begin
                                        if(cnt>23 && cnt<=150)   
                                                NS=LOOP;
                                        else
                                                NS=HIGH;
                                end
                               
                        LOOP:
                                begin
                                        if(cnt==0)   
                                                NS=IDLE;
                                        else
                                                NS=LOOP;
                                end
                endcase
        end
       
always @ (posedge clk or negedge rst)
        if(!rst)
                begin
                        SH<=1;
                        F1<=1;
                        cnt1<=0;
                end
        else
                begin
                        //SH<=1;
                        //F1<=1;
                        case(NS)
                                IDLE :
                                        begin
                                                SH<=1;
                                                F1<=1;
                                        end
                                SHIFT:
                                        begin
                                                SH<=1;
                                                F1<=1;
                                        end
                                HIGH :
                                        begin       
                                                SH<=0;
                                                F1<=1;
                                        end
                                LOOP :   //LOOP态下运行正确,可以得到1M的F1
                                begin
                                        SH<=0;
                                       
                                                if(cnt1==11)
                                                        cnt1<=0;
                                                else
                                                        begin
                                                                if(cnt1<6)
                                                                        begin
                                                                                F1<=0;
                                                                                cnt1<=cnt1+1;
                                                                        end
                                                                else
                                                                        begin
                                                                                F1<=1;
                                                                                cnt1<=cnt1+1;
                                                                        end
                                                        end
                                        end
                        endcase
                end
               
endmodule               
知道程序这玩意不应该拿来让别人找bug,但是实在不知道怎么回事。
希望大家帮忙看看。
谢谢。                               

相关帖子

沙发
GoldSunMonkey| | 2013-1-9 23:09 | 只看该作者
把所有信号的仿真图,贴出来

使用特权

评论回复
板凳
li37hao| | 2013-1-9 23:49 | 只看该作者
是不是cnt计数比clk快?

使用特权

评论回复
地板
静默雪原|  楼主 | 2013-1-10 09:17 | 只看该作者
li37hao 发表于 2013-1-9 23:49
是不是cnt计数比clk快?

cnt是对12M计数,clk也是12M

使用特权

评论回复
5
li37hao| | 2013-1-10 12:35 | 只看该作者
那就试试把clk反相

使用特权

评论回复
6
静默雪原|  楼主 | 2013-1-10 13:00 | 只看该作者
li37hao 发表于 2013-1-10 12:35
那就试试把clk反相

你太厉害了。
我把时序部分的posedge clk改为negedge clk这部分就可以了。
但是我不知道为什么。
求解求解。

使用特权

评论回复
7
li37hao| | 2013-1-10 13:06 | 只看该作者
cnt是clk的上升沿产生的,那你在用上升沿去采的话,就有可能采到cnt的不稳态了!

使用特权

评论回复
8
静默雪原|  楼主 | 2013-1-10 13:13 | 只看该作者
li37hao 发表于 2013-1-10 13:06
cnt是clk的上升沿产生的,那你在用上升沿去采的话,就有可能采到cnt的不稳态了! ...

原来如此。懂了,谢谢你。
希望以后有问题可以多多指教。
分也给你了。

使用特权

评论回复
9
静默雪原|  楼主 | 2013-1-10 14:01 | 只看该作者
程序还有一个bug,需要对cnt1进行清零。
HIGH :
        begin       
                SH<=0;
                F1<=1;
                cnt1<=0;
        end

使用特权

评论回复
10
GoldSunMonkey| | 2013-1-10 23:19 | 只看该作者
这个方法完全不是应该用的办法。
这个办法未来太多问题了。如果资源使用多的话。
只能证明你写的东西,时序太差了

使用特权

评论回复
11
静默雪原|  楼主 | 2013-1-11 09:38 | 只看该作者
GoldSunMonkey 发表于 2013-1-10 23:19
这个方法完全不是应该用的办法。
这个办法未来太多问题了。如果资源使用多的话。
只能证明你写的东西,时序 ...

嗯。其实后面把时钟沿又改过来,仿真也是可以的。所以应该是没有清零。
在其他地方也见过将clk反向的,所以不知道这是不是也是一种可能。
继续学习。
而且,我用的是计数器控制系统采样周期。大概4ms。
不知道有没有其他更好的办法
thanks

使用特权

评论回复
12
GoldSunMonkey| | 2013-1-12 23:03 | 只看该作者
静默雪原 发表于 2013-1-11 09:38
嗯。其实后面把时钟沿又改过来,仿真也是可以的。所以应该是没有清零。
在其他地方也见过将clk反向的,所 ...

最好别反向

使用特权

评论回复
13
GoldSunMonkey| | 2013-1-12 23:03 | 只看该作者
静默雪原 发表于 2013-1-11 09:38
嗯。其实后面把时钟沿又改过来,仿真也是可以的。所以应该是没有清零。
在其他地方也见过将clk反向的,所 ...

你的始终速率不高,问题应该不大

使用特权

评论回复
14
li37hao| | 2013-1-13 15:50 | 只看该作者
反相的结果确实会影响到整个系统,简单的系统可能没什么问题,稍微复杂的就容易产生问题的,最直接的就是资源占用会大增

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

12

帖子

0

粉丝