lllyxl 2022-12-17 23:23 采纳率: 100%
浏览 28
已结题

怎么让这串verilog的代码检测11010这串数据

reg [7:0] din_r;

assign led = din;

reg [2:0] state;/eck serial 5'b1_1010
always @ (posedge clk or negedge rst_n)
if (!rst_n) begin
    flag <= 1'b0;
    din_r <= din;
    state <= 'd0;    
end
else if(!en) begin
    case (state):
        'd0 :
            begin
                flag <= 1'b0;
                din_r <= {din_r[6:0],1'b1};
                if (din_r[7]==1'b0)//被检测数据的最高位和0相比,是否相等
                    state <= 'd1;
                else
                    state <= 'd0;
            end
        'd1 :
            begin
                flag <= 1'b0;
                din_r <={din_r[6:0],1'b1};
                if (din_r[7] == 1'b0)
                    state <= 'd1;
                else
                    state <= 'd0;
            end
        'd2 :
            begin
                flag <= 1'b0;
                din_r <={din_r[6:0],1'b1};
                if (din_r[7] == 1'b0)
                    state <= 'd2;
                else
                    state <= 'd0;
            end
        'd3 :
            begin
                flag <= 1'b0;
                din_r <={din_r[6:0],1'b1};
                if (din_r[7] == 1'b0)
                    state <= 'd4;
                else
                    state <= 'd0;
            end
        'd4 :
            begin
                if (din_r[7] == 1'b0)
                    flage <= 1'b1;
                end
            default :
                begin
                    state <= 'd0;
                    flag <= 1'b0;
                end
        endcase
    end
                

endmodule

  • 写回答

2条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2022-12-18 01:50
    关注

    ChatGPT尝试解答,仅供参考
    这段代码似乎是在尝试检测输入数据(din)是否为 11010。但是,目前看起来并不能实现这个功能。我们来看一下原因:

    din_r 是一个 8 位的寄存器,但是你正在尝试检测的数据是 5 位的,因此你需要更改 din_r 的大小。

    在状态机的各个状态中,你正在将寄存器的低 7 位赋值为 1,这样会导致你的寄存器中永远只有 1。因此你需要更新寄存器的值,使其能够保存输入数据。

    在状态机的各个状态中,你正在比较寄存器的最高位是否为 0,但是你实际上应该比较寄存器中保存的数据是否与 11010 相等。

    因此,为了让这段代码能够正确检测 11010,你需要做如下修改:

    • 更改 din_r 的大小为 5 位。
    • 在状态机的各个状态中,更新寄存器的值,使其能够保存输入数据。例如,在状态 0 中,你可以将寄存器的值设为 {din_r[3:0], din[7:4]}。
    • 在状态机的各个状态中,比较寄存器中保存的数据是否与 11010 相等。例如,在状态 0 中,你可以使用如下语句来比较:
      if (din_r == 5'b11010)
        state <= 'd1;
      else
        state <= 'd0;
      
      这样,如果寄存器中保存的数据是 11010,则转移到状态 1;否则,保持在状态 0。

    在其他状态中,你也需要使用类似的方式来比较寄存器中保存的数据是否与 11010 相等,然后决定是否转移到下一个状态。


    另外,如果你希望在检测到 11010 后输出标志位,你可以在状态机的最后一个状态中设置标志位,例如:

    flag <= 1'b1
    

    最后,你还需要调整状态机的数量和顺序,以便检测 11010。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月14日
  • 已采纳回答 1月6日
  • 创建了问题 12月17日

悬赏问题

  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助
  • ¥15 STM32控制MAX7219问题求解答