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 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000