版主帮帮忙:VHDL,verilog混合仿真碰到一个奇怪的现象

[复制链接]
5237|26
 楼主| edacsoft 发表于 2011-11-11 16:17 | 显示全部楼层 |阅读模式

其中一个子模块是verilog的,VHDL顶层,
这个子模块verilog代码如下:
  
parameter STANBY = 3'b100,CAPTURE_IDLE = 3'b000, SWEEP = 3'b001, LONG_INTG = 3'b010 , FRAME_READ = 3'b011;
  
         FRAME_READ     : begin
                           if ( frame_rd_end )  
                             if (!fcon_en) cap_st <= CAPTURE_IDLE;
                             else cap_st <= LONG_INTG;
                           end
  
从仿真图可以看见frame_rd_end='1' ,fcon_en='0'为什么这句话cap_st <= CAPTURE_IDLE 不执行呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
GoldSunMonkey 发表于 2011-11-11 22:41 | 显示全部楼层
代码稍微多贴一点
状态机贴多一点
AutoESL 发表于 2011-11-12 00:08 | 显示全部楼层
太不完整了,从图上看,好像没有执行到这里:既不是 CAPTURE_IDLE也不是LONG_INTG啊
                           if ( frame_rd_end )  
                             if (!fcon_en) cap_st <= CAPTURE_IDLE;
                             else cap_st <= LONG_INTG;
                           end
GoldSunMonkey 发表于 2011-11-12 13:38 | 显示全部楼层
太不完整了,从图上看,好像没有执行到这里:既不是 CAPTURE_IDLE也不是LONG_INTG啊
                           if ( frame_rd_end )  
                             if (!fcon_en) cap_st  ...
AutoESL 发表于 2011-11-12 00:08

兄弟,已经执行到这里,只是不知道什么条件触发他不能跳变。。
lxAPP 发表于 2011-11-12 14:30 | 显示全部楼层
嘿嘿,很奇怪呢。
opple 发表于 2011-11-12 15:01 | 显示全部楼层
不能跳变?
opple 发表于 2011-11-12 15:01 | 显示全部楼层
 楼主| edacsoft 发表于 2011-11-12 18:27 | 显示全部楼层
代码如下:
always @(posedge pixclk or negedge reset_n)
   begin
       if (!reset_n)
           begin
       cap_st <= STANBY;
       {cap_stby_en,cap_idle_en, sweep_en, long_intg_en, frame_rd_en} <= 5'b10000;
       end
     else if (syn_rst_in) begin
       cap_st <= STANBY;
       {cap_stby_en,cap_idle_en, sweep_en, long_intg_en, frame_rd_en} <= 5'b10000;
       end
     else
       casex (cap_st)
           STANBY :         begin
                                            {cap_stby_en,cap_idle_en, sweep_en, long_intg_en, frame_rd_en} <= 5'b10000;
                            if (afe_init_end)
                              cap_st <= CAPTURE_IDLE;  
                           end
         CAPTURE_IDLE : begin
                          {cap_stby_en,cap_idle_en, sweep_en, long_intg_en, frame_rd_en} <= 5'b01000;
                          if ( fcon_en || (soft_trg_en && soft_trigger_in) || (ext_trg_en && ext_trigger_in))
                             cap_st <= SWEEP;  
                        end
                             
         SWEEP          :  begin
                           {cap_stby_en,cap_idle_en, sweep_en, long_intg_en, frame_rd_en} <= 5'b00100;
                             if ( sweep_end ) cap_st <= LONG_INTG ;
                           
//                            if (long_exp_en) cap_st <= LONG_INTG ;
//                            else             cap_st <= FRAME_READ;
                           end
         LONG_INTG      : begin
                           {cap_stby_en,cap_idle_en, sweep_en, long_intg_en, frame_rd_en} <= 5'b00010;
                          if (long_exp_en)
                            if ( long_intg_end )  cap_st <= FRAME_READ  ;
                            else                  cap_st <= LONG_INTG ;
                          else  cap_st <= FRAME_READ;
                         end
                          
         FRAME_READ     : begin
                           {cap_stby_en,cap_idle_en, sweep_en, long_intg_en, frame_rd_en} <= 5'b00001;
                           if ( frame_rd_end )  
                             if (!fcon_en) cap_st <= CAPTURE_IDLE;
                             else cap_st <= LONG_INTG;
                           end
         default        : cap_st <= STANBY;
       endcase
   end
GoldSunMonkey 发表于 2011-11-13 01:24 | 显示全部楼层
这样改下,然后上结果给我看。      
  FRAME_READ     : begin
                           {cap_stby_en,cap_idle_en, sweep_en, long_intg_en, frame_rd_en} <= 5'b00001;
                           if ( frame_rd_end )  
                             if (!fcon_en) cap_st <= CAPTURE_IDLE;
                             else cap_st <= LONG_INTG;
                           else cap_st <= FRAME_READ;  
                           end
ooljo 发表于 2011-11-13 16:52 | 显示全部楼层
过来学习下
ooljo 发表于 2011-11-13 16:52 | 显示全部楼层
:handshake
GoldSunMonkey 发表于 2011-11-13 16:58 | 显示全部楼层
...帮忙看下代码呗
Backkom80 发表于 2011-11-14 12:55 | 显示全部楼层
casex()?
如果你状态机确定了,用case吧,
GoldSunMonkey 发表于 2011-11-14 12:57 | 显示全部楼层
GoldSunMonkey 发表于 2011-11-14 13:05 | 显示全部楼层
人了?
jakfens 发表于 2011-11-14 17:14 | 显示全部楼层
呵呵有代码猴哥改起来就爽了
GoldSunMonkey 发表于 2011-11-14 17:15 | 显示全部楼层
上面你的名字写错了,不知道能不能领奖啊。哈哈
我想冒名顶你。哈哈~~
GoldSunMonkey 发表于 2011-11-14 17:16 | 显示全部楼层
马上注册一个akfens,哈哈
 楼主| edacsoft 发表于 2011-11-15 14:09 | 显示全部楼层
这样改下,然后上结果给我看。      
  FRAME_READ     : begin
                           {cap_stby_en,cap_idle_en, sweep_en, long_intg_en, frame_rd_en}
GoldSunMonkey 发表于 2011-11-13 01:24

改完结果一样。
modelsim中st0和0,st1和1有什莫区别?
wire frame_rd_end;
assign   frame_rd_end = (v_cnt == V_FF_NUM - 1 && h_cnt_end && frame_mode == FULL_FRAME) || (v_cnt == V_HS_NUM-1 && h_cnt_end && frame_mode == HIGH_SPEED);
modelsim中显示frame_rd_end是st1.
原图中我是后强制它为binary
GoldSunMonkey 发表于 2011-11-15 15:59 | 显示全部楼层
那是不是证明你强制的那个状态并不是真正的FRAME_READ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

246

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部