搜索
bottom↓
回复: 0

请大家帮忙看看是不是频率太高了?无法跳出idle状态。

[复制链接]

出0入0汤圆

发表于 2011-5-16 15:45:40 | 显示全部楼层 |阅读模式
大家好,
请教一个问题,以下代码目的是通过检测ledl_en这个变量,一旦发生变化,即pos_edge有效时出发状态机送出数据,但是在板上实验发现无法运行,使用晶振为50M的,我怀疑是pos_edge问题,因为我把
        case(c_state)
                idle:
                begin
                        cs = 1'b0;
                        wr = 1'b0;               
                        if((~busy)&pos_edge)
                                n_state = bety0_start;
改成
        case(c_state)
                idle:
                begin
                        cs = 1'b0;
                        wr = 1'b0;               
                        if(~busy)
                                n_state = bety0_start;
就会运行。也许大家说可能led_en没有变化,所以状态没改变,但是我使用示波器或者其他手段测试,确定是有运行的,很大可能是不是晶振频率太高了?但是我调低了也没有变化。
请大家帮我看看怎么解决,谢谢大家。






reg [7:0] reg_1, reg_2;

always @(posedge clk, posedge rst)
if(rst)
begin
        reg_1 <= 0;
        reg_2 <= 0;
end
else
begin
        reg_1 <= led_en;
        reg_2 <= reg_1;
end
       
wire pos_edge = (reg_1 != reg_2); // now we can detect de_clk rising edges
assign edge_h = pos_edge;

reg [3:0] c_state, n_state;
always @(posedge clk, posedge rst)
        if(rst)
                c_state <= idle;
        else
                c_state <= n_state;


always @(*)
        case(c_state)
                idle:
                begin
                        cs = 1'b0;
                        wr = 1'b0;               
                        if((~busy)&pos_edge)
                                n_state = bety0_start;
                end
               
                bety0_start:
                begin
                        cs = 1'b1;
                        wr = 1'b1;               
                        out_data = 8'h41;
                        n_state = bety0_end;
                end
       
                bety0_end:
                begin
                        cs = 1'b0;
                        wr = 1'b0;                               
                        if(~busy)
                                n_state = bety1_start;
                end

                bety1_start:
                begin
                        cs = 1'b1;
                        wr = 1'b1;               
                        out_data = 8'h01;
                        n_state = bety1_end;
                end
       
                bety1_end:
                begin
                        cs = 1'b0;
                        wr = 1'b0;                               
                        if(~busy)
                                n_state = bety2_start;
                end

                bety2_start:
                begin
                        cs = 1'b1;
                        wr = 1'b1;                                       
                        out_data = reg_dat[7:0];
                        n_state = bety2_end;
                end
                       
                bety2_end:
                begin
                        cs = 1'b0;
                        wr = 1'b0;                                       
                        if(~busy)
                                n_state = bety3_start;
                end
               
                bety3_start:
                begin
                        cs = 1'b1;
                        wr = 1'b1;               
                        out_data = 8'h41;
                        n_state = bety3_end;
                end
       
                bety3_end:
                begin
                        cs = 1'b0;
                        wr = 1'b0;                               
                        if(~busy)
                                n_state = bety4_start;
                end

                bety4_start:
                begin
                        cs = 1'b1;
                        wr = 1'b1;               
                        out_data = 8'h02;
                        n_state = bety4_end;
                end
       
                bety4_end:
                begin
                        cs = 1'b0;
                        wr = 1'b0;                               
                        if(~busy)
                                n_state = bety5_start;
                end

                bety5_start:
                begin
                        cs = 1'b1;
                        wr = 1'b1;                                       
                        out_data = reg_dat[15:8];
                        n_state = bety5_end;
                end
                       
                bety5_end:
                begin
                        cs = 1'b0;
                        wr = 1'b0;                                       
                        if(~busy)
                                n_state = idle;
                end
               
                default: n_state = idle;
        endcase

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

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

本版积分规则

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

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

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

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