打印

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

[复制链接]
4309|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

兄弟,已经执行到这里,只是不知道什么条件触发他不能跳变。。

使用特权

评论回复
5
lxAPP| | 2011-11-12 14:30 | 只看该作者
嘿嘿,很奇怪呢。

使用特权

评论回复
6
opple| | 2011-11-12 15:01 | 只看该作者
不能跳变?

使用特权

评论回复
7
opple| | 2011-11-12 15:01 | 只看该作者
:o

使用特权

评论回复
8
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

使用特权

评论回复
9
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

使用特权

评论回复
10
ooljo| | 2011-11-13 16:52 | 只看该作者
过来学习下

使用特权

评论回复
11
ooljo| | 2011-11-13 16:52 | 只看该作者
:handshake

使用特权

评论回复
12
GoldSunMonkey| | 2011-11-13 16:58 | 只看该作者
...帮忙看下代码呗

使用特权

评论回复
13
Backkom80| | 2011-11-14 12:55 | 只看该作者
casex()?
如果你状态机确定了,用case吧,

使用特权

评论回复
14
GoldSunMonkey| | 2011-11-14 12:57 | 只看该作者
:)

使用特权

评论回复
15
GoldSunMonkey| | 2011-11-14 13:05 | 只看该作者
人了?

使用特权

评论回复
16
jakfens| | 2011-11-14 17:14 | 只看该作者
呵呵有代码猴哥改起来就爽了

使用特权

评论回复
17
GoldSunMonkey| | 2011-11-14 17:15 | 只看该作者
上面你的名字写错了,不知道能不能领奖啊。哈哈
我想冒名顶你。哈哈~~

使用特权

评论回复
18
GoldSunMonkey| | 2011-11-14 17:16 | 只看该作者
马上注册一个akfens,哈哈

使用特权

评论回复
19
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

使用特权

评论回复
20
GoldSunMonkey| | 2011-11-15 15:59 | 只看该作者
那是不是证明你强制的那个状态并不是真正的FRAME_READ?

使用特权

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

本版积分规则

44

主题

246

帖子

0

粉丝