Extend khối TX để gửi 2 bytes
Vì tôi có bài sẵn về khối TX trước đây cho nên để giản tiện trong vấn đề giải thích về cách thay đổi để gửi 2 bytes như bạn quachtinh đã đề cập. Tôi sửa lại cái state machine để đặt thêm 3 states nữa cho byte thứ nhì. Code tôi sửa lại cho vấn đề đó ở dưới đây. Tôi chưa chạy thử, hy vọng các bạn giúp để thử giùm.
Nguyên văn bởi quachtinh83
Xem bài viết
Code:
module uart_tx (
clk, reset, tx_tick, tx_rdy, tx_reg1, tx_reg2, tx_done_o, tx_sdata_o
);
input clk;
input reset;
input tx_tick;
input tx_rdy;
input [7:0] tx_reg;
output tx_done_o;
output tx_sdata_o;
parameter IDLE = 6'b000001, START1 = 6'b000010, DATA1 = 6'b000100;
parameter STOP1 = 6'b001000, START2 = 6'b010000, DATA2 = 6'b100000;
reg [5:0] st;
reg tx_done, tx_sdata;
reg [2:0] cnt;
assign tx_done_o = tx_done;
assign tx_sdata_o = tx_sdata;
always @ (posedge clk or reset) begin
if (reset) begin
tx_done = 1;
st = IDLE;
tx_sdata = 1;
end
else begin
if (tx_tick) begin
case (st)
IDLE: begin
tx_sdata = 1;
if (tx_rdy) begin
st = START1;
tx_done = 0;
end
end
START1: begin
tx_sdata = 0;
cnt = 0;
st = DATA1;
end
DATA1: begin
tx_sdata = tx_reg1[cnt];
if (cnt == 7)
st = STOP1;
else
cnt = cnt + 1;
end
STOP1: begin
tx_sdata = 1;
st = START2;
end
START2: begin
tx_sdata = 0;
cnt = 0;
st = DATA2;
end
DATA2: begin
tx_sdata = tx_reg2[cnt];
if (cnt == 7) begin
st = IDLE;
tx_done = 1;
end
else
cnt = cnt + 1;
end
default : st = IDLE;
endcase
end
end
end
endmodule

Comment