返回该小组首页 回复主题
hnnanaii

hnnanaii

小组等级:     E币:75  (E币换礼)

#1楼主:帮忙看看这个错误

文章发表于:2008-05-29 10:24

http://blog.ednchina.com/hnnanaii/119486/message.aspx

是什么原因?

hnnanaii

   小组等级:    E币:75  (E币换礼)

#2

文章发表于:2008-05-30 10:19

FPGA代码如下,设计是想让FPGA接收来自MCU的方波信号,每一个方波计数器加1,也就是地址加1,实际上却很难实现,老是出现计数器回走或停顿现象,大侠帮忙看看原因吧,错误图形看看下边

always@(posedge clk_32 or negedge reset_in)
        begin
            if(!reset_in) begin
                Sending         <= 1'b0;
                ramvc_oe_rd     <= 1'b1;
                ramv_ce_rd      <= 1'b1;
                ramc_ce_rd      <= 1'b1;
                ramvc_addr_up     <= 15'h0;
                UP_State        <= UP_Stop;
            end
            else begin
                case(UP_State)                            
                    UP_Stop: begin
                        if(AD_Finish && (MCU[3:1] == 3'b010))
                            UP_State    <= UP_Init;                            
                        else
                            UP_State    <= UP_Stop;
                        
                        ramvc_oe_rd        <= 1'b1;
                        ramv_ce_rd        <= 1'b1;
                        ramc_ce_rd        <= 1'b1;
                        ramvc_addr_up    <= ramvc_addr_up;
                        Sending            <= 1'b0;
                    end
                    UP_Init: begin
                        Sending            <= 1'b1;
                        ramvc_oe_rd        <= 1'b0;
                        ramv_ce_rd        <= MC5;
                        ramc_ce_rd        <= !MC5;
                        ramvc_addr_up    <= 15'h8;
                        UP_State        <= UP_Wait;
                    end
                    UP_Wait: begin
                        Sending            <= 1'b1;
                        ramvc_oe_rd        <= 1'b0;
                        ramv_ce_rd        <= MC5;
                        ramc_ce_rd        <= !MC5;
                        ramvc_addr_up    <= ramvc_addr_up;
                        if(MCU_CLK)
                            UP_State    <= UP_Hold;
                        else
                            UP_State    <= UP_Wait;
                        if(MCU[3:1] != 3'b010)
                            UP_State    <= UP_Stop;
                    end
                    UP_Hold: begin
                        if(MCU_CLK)
                            UP_State    <= UP_Next;
                        else
                            UP_State    <= UP_Wait;
                        ramvc_oe_rd        <= 1'b0;
                        ramv_ce_rd        <= MC5;
                        ramc_ce_rd        <= !MC5;
                        ramvc_addr_up    <= ramvc_addr_up;
                        Sending            <= 1'b1;
                    end
                    UP_Next: begin
                        if(MCU_CLK) begin
                            UP_State        <= UP_Next;
                            ramvc_addr_up    <= ramvc_addr_up;
                        end
                        else begin
                            UP_State        <= UP_Wait;
                            ramvc_addr_up    <= ramvc_addr_up + 15'h1;
                        end
                        ramvc_oe_rd    <= 1'b0;
                        ramv_ce_rd    <= 1'b0;
                        ramc_ce_rd    <= 1'b0;
                        Sending        <= 1'b1;
                    end
                   
                    default:    UP_State    <= UP_Wait;
                           
                endcase
           
            end
        end
点击看大图

点击看大图

songchao01

   小组等级:    E币:447  (E币换礼)

#3

文章发表于:2008-05-30 11:37

                        if(MCU_CLK)
                            UP_State    <= UP_Hold;
                        else
                            UP_State    <= UP_Wait;
                        if(MCU[3:1] != 3'b010)
                            UP_State    <= UP_Stop;

有没有可能MCU_CLK信号为高电平时,MCU[3:1]也同时满足  MCU[3:1] != 3'b010 这个条件??我个人认为,这种情况下可能会出现 UP_State状态不定,因为非阻塞赋值在赋值开始时刻计算RHS表达式,在赋值结束时刻更新LHS的值,在always块结束时,有可能出现竞争冒险。

如果这两个条件判断有先后顺序,建议  用 if ...else   

                                                                                              begin

                                                                                              end

此外,如果MCU_CLK信号的脉宽如果远远小于 clk_32 ,也有可能会造成  if(MCU_CLK)  语句无法稳定采样,个人愚见,希望对你有所帮助

hnnanaii

   小组等级:    E币:75  (E币换礼)

#4

文章发表于:2008-06-02 09:16

此外,如果MCU_CLK信号的脉宽如果远远小于 clk_32 ,也有可能会造成  if(MCU_CLK)  语句无法稳定采样,个人愚见,希望对你有所帮助

有没有可能脉宽太大也无法保持稳定?

songchao01

   小组等级:    E币:447  (E币换礼)

#5

文章发表于:2008-06-03 09:45

如果脉宽太大,大于两个clk_32周期,就有可能出现下面这种情况:

在clk_32的第一个采样周期 采样 MCU_CLK信号为高;在第二个采样周期MCU_CLK也为高。如果你希

望第二个采样周期MCU_CLK为低,则MCU_CLK的脉宽至少应该满足   大于1 x clk_32小于2 x clk_32。

如果两时钟的相位关系不固定也可能采样不稳定

总共 , 当前 /

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

  • DesignDesign
  • HTMLHTML

浏览该小组的用户还看过...

所有小组精华文章