exp(x). 2022-06-10 20:46 采纳率: 66.7%
浏览 156
已结题

串口用状态机发送多字节

这种写法错哪里了呢,为什么这个Data会只维持一个时钟周期后又变了

img

img


状态机代码:
`timescale 1ns / 1ps

module uart_tx_data(
Clk,
Reset_n,
DATA40,
trans_go,
uart_tx,
trans_done
);

input Clk;
input Reset_n;
input trans_go;
input [39:0]DATA40;
output uart_tx;
output trans_done;

reg [7:0]Data;
reg Send_Go;
wire Tx_done;

uart_byte_tx uart_byte_tx(
    .Clk(Clk),    
    .Reset_n(Reset_n),
    .Data(Data),   
    .Send_Go(Send_Go),
    .Baud_set(3'd4),
    .uart_tx(uart_tx),
    .Tx_done(Tx_done) 
    );

reg [2:0]state, next_state;
parameter IDLE = 0, send1 = 1, send2 = 2, send3 = 3, send4 = 4, send5 = 5;


always @(posedge Clk or negedge Reset_n)
begin 
if (!Reset_n)
Send_Go <= 0;
else if (Tx_done)
Send_Go <= 1;
else if (trans_go)
Send_Go <= 1;
else
Send_Go <= 0;
end

always @(*)
begin    
    case (state)
    0: begin
        if (trans_go) begin
        Data = DATA40[7:0];
        next_state = 1;
        end
        else begin
        Data = Data;
        next_state = 0;
        end
    end
    1: begin
        if (Tx_done) begin
        Data = DATA40[15:8];
        next_state = 2;
        end
        else
        begin
        Data = Data;
        next_state = 1;
        end
    end
    2: begin
        if (Tx_done) begin
        Data = DATA40[23:16];
        next_state = 3;
        end
        else
        begin
        Data = Data;
        next_state = 2;
        end
    end
    3: begin
        if (Tx_done) begin
        Data = DATA40[31:24];
        next_state = 4;
        end
        else
        begin
        Data = Data;
        next_state = 3;
        end
    end
    4: begin
        if (Tx_done) begin
        Data = DATA40[39:32];
        next_state = 5;
        end
        else
        begin
        Data = Data;
        next_state = 4;
        end
    end
    5: begin
        if (Tx_done)
        next_state = 0;
        else begin
            next_state = 5;
            end
        end
    default:begin
            next_state = 0;
            Data = 0;
            end
    endcase
end

always @(posedge Clk or negedge Reset_n)
begin
    if (!Reset_n)
    state = 0;
    else
    state = next_state;
end

assign trans_done = (state == 5 && Tx_done == 1);

endmodule

  • 写回答

3条回答 默认 最新

查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月25日
  • 已采纳回答 6月17日
  • 修改了问题 6月10日
  • 创建了问题 6月10日

悬赏问题

  • ¥15 高价求中通快递查询接口
  • ¥15 解决一个加好友限制问题 或者有好的方案
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 急matlab编程仿真二阶震荡系统
  • ¥20 TEC-9的数据通路实验
  • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
  • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?