hhwsss 2023-01-17 20:17 采纳率: 33.3%
浏览 16

hdlbits数据包解析器

另请参阅:PS/2 数据包解析器。

现在您有一个状态机来识别 PS/2 字节流中的三字节消息,请添加一个数据路径,该数据路径也将在收到数据包时输出 24 位(3 字节)消息(out_bytes[23:16] 是第一个字节,out_bytes[15:8] 是第二个字节,依此类推)。

每当断言完成信号时,out_bytes都需要有效。你可以在其他时间输出任何东西(即,不在乎)。

module top_module(
    input clk,
    input [7:0] in,
    input reset,    // Synchronous reset
    output [23:0] out_bytes,
    output done); //
    reg [2:0] state,new_state;
    parameter s0=0,s1=1,s2=2,s3=3;
    always@(*)begin
        case(state)
            s0:begin new_state=in[3]?s1:s0;out_bytes[7:0]<=in[7:0] ;end
            s1:begin new_state=s2; out_bytes[23:16]<=in[7:0] ;end
            s2:begin new_state=s3;out_bytes[15:8]<=in[7:0];end
            s3:begin new_state=in[3]?s1:s0;out_bytes[7:0]<= in[7:0] ;end
        endcase
    end
    always@(posedge clk)begin
        if(reset) state<=s0;
        else state<=new_state;
    end
    assign done=state==s3;
    
        
 
endmodule

img

img

为什么把结果输出和状态放在一块不能实现结果

  • 写回答

1条回答 默认 最新

  • 快撑死的鱼 2023-01-18 23:05
    关注

    回答不易,求求您采纳点赞哦

    这段代码的问题在于它没有正确地将 out_bytes 信号的输出与消息识别的完成同步。out_bytes 信号在状态机的组合逻辑中被更新,但它应该只在同步逻辑中被更新,即在对时钟边沿敏感的 always 块中。此外,完成信号未用于正确断言输出字节有效。

    以下是如何修改代码以获得所需结果的参考:

    module top_module(
        input clk,
        input [7:0] in,
        input reset,    // Synchronous reset
        output [23:0] out_bytes,
        output done); 
        reg [2:0] state,new_state;
        reg [23:0] out_bytes_reg;
        parameter s0=0,s1=1,s2=2,s3=3;
        always@(posedge clk)begin
            if(reset) state<=s0;
            else state<=new_state;
        end
        always@(*)begin
            case(state)
                s0:begin new_state=in[3]?s1:s0;end
                s1:begin new_state=s2; out_bytes_reg[23:16]<=in[7:0] ;end
                s2:begin new_state=s3;out_bytes_reg[15:8]<=in[7:0];end
                s3:begin new_state=in[3]?s1:s0;out_bytes_reg[7:0]<= in[7:0] ;end
            endcase
        end
        assign out_bytes = state == s3 ? out_bytes_reg : 24'b0;
        assign done = state == s3;
    endmodule
    

    在此示例中,out_bytes_reg 是一个寄存器,用于保存正在组装的输出字节。当状态机处于状态 s3 时,输出字节仅分配给 out_bytes 信号,此时消息识别已完成。此外,当状态机处于状态 s3 时,完成信号被置位,表明输出字节有效。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月17日

悬赏问题

  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错