verilog always块中case相关问题


always块内case外语句的执行

问题描述

下列代码中,信号n_state和pack_cnt_inc,在case中default中设有默认值,如果case语句中满足表达式中的条件,则n_state和pack_cnt_inc按条件下的数值赋值,如何case语句中条件不满足,则按case条件外n_state和pack_int_inc来赋值。

 always @(*) begin
    n_state                             = state;
    din_axis_tready                     = dout_axis_tready;
    n_dout_axis_tvalid                  = 0;
    n_dout_axis_tdata                   = dout_axis_tdata;
    n_dout_axis_tlast                   = 0;
    pack_cnt_inc                        = 0; 
    data_vld_cnt_inc                    = 0; 
    case (state)
      HEADER: begin
        if (din_axis_tvalid) begin       
          n_state                           = DATA;
          n_dout_axis_tvalid                = 1;
          n_dout_axis_tdata[7:0]            = {2'b0, eol, sof, ch_id};
          n_dout_axis_tdata[31:8]           = 24'hCAFEAB;
          n_dout_axis_tdata[DOUT_SZ-1:32]   = {din_axis_tdata[DIN_SZ-1:0], {(DOUT_SZ-DIN_SZ-32){1'b0}}};
        end
      end
      DATA: begin
        if (din_axis_tvalid & sof) begin
          n_dout_axis_tvalid                = 1;
          n_dout_axis_tdata[7:0]            = {2'b0, eol, sof, ch_id};
          n_dout_axis_tdata[31:8]           = 24'hCAFEAB;
          n_dout_axis_tdata[DOUT_SZ-1:32]   = {din_axis_tdata[DIN_SZ-1:0], {(DOUT_SZ-DIN_SZ-32){1'b0}}};
        end
        else if (din_axis_tvalid) begin                      
          n_dout_axis_tdata             = dout_axis_tdata>>DIN_SZ | {din_axis_tdata, {(DOUT_SZ-DIN_SZ){1'b0}}};
          data_vld_cnt_inc              = 1; 
          if (pack_cnt != (PACK_CYCLE-1) && eof)begin
            n_state                     = PAD;
            pack_cnt_inc                = 1;             
            n_dout_axis_tvalid          = 1;          
          end
          else if(data_vld_cnt == (D_VLD_CNT-1)) begin
            n_dout_axis_tvalid          = 1;
            pack_cnt_inc                = 1; 
            if(pack_cnt == (PACK_CYCLE-1)) begin
              n_state                   = HEADER;
              n_dout_axis_tlast         = 1;
            end
          end
        end
      end
      PAD: begin     
        pack_cnt_inc                    = 1; 
        n_dout_axis_tvalid              = 1;
        n_dout_axis_tdata               = {(DOUT_SZ){1'b0}};          
        din_axis_tready                 = 0;
        if (pack_cnt == (PACK_CYCLE-1)) begin
          n_state                       = HEADER;
          n_dout_axis_tlast             = 1;
        end
      end
      default: begin
        n_state                           = HEADER;
        pack_cnt_inc                           = 1;
      end
    endcase 
  end        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吹泡泡茶壶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值