|
发表于 2025-3-20 18:19:49
|
显示全部楼层
module data_converter2 (
input clk,
input rst,
input in_valid,
output logic in_ready,
input [31:0] in_data,
output logic out_valid,
input out_ready,
output logic [23:0] out_data
);
typedef enum logic [1:0] {
S0, S1, S2, S3
} state_t;
state_t state;
logic [23:0] saved_data;
// Input control
assign in_ready = (state != S3) && out_ready;
// Output generation
always_comb begin
case(state)
S0: out_data = in_data[23:0];
S1: out_data = {in_data[15:0], saved_data[7:0]};
S2: out_data = {in_data[7:0], saved_data[15:0]};
S3: out_data = saved_data;
default: out_data = 24'b0;
endcase
end
// Output validation
assign out_valid = (state == S3) ? 1'b1 : (in_valid & in_ready);
// Main state machine
always_ff @(posedge clk or posedge rst) begin
if (rst) begin
state <= S0;
saved_data <= 24'b0;
end else begin
if (out_valid && out_ready) begin
case(state)
S0: begin
if (in_valid && in_ready) begin
saved_data[7:0] <= in_data[31:24];
state <= S1;
end
end
S1: begin
if (in_valid && in_ready) begin
saved_data[15:0] <= in_data[31:16];
state <= S2;
end
end
S2: begin
if (in_valid && in_ready) begin
saved_data <= in_data[31:8];
state <= S3;
end
end
S3: begin
state <= S0;
saved_data <= 24'b0;
end
endcase
end
end
end
endmodule
用Deepseek出的这个吧, 我那个估计你理解费劲,我那个还有个小问题. |
|