-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUART_wrapper.sv
76 lines (59 loc) · 1.37 KB
/
UART_wrapper.sv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
module UART_wrapper(clk, rst_n, RX, trmt, resp, tx_done, TX, clr_cmd_rdy, cmd, cmd_rdy);
input logic clk, rst_n, RX, trmt, clr_cmd_rdy;
input logic [7:0] resp;
output logic cmd_rdy, tx_done, TX;
output logic [15:0] cmd;
logic rx_rdy, clr_rdy, byte_sel;
logic [7:0] rx_data;
logic [7:0] ff_in;
logic [7:0]upperbyte;
logic set_cmd_rdy;
//instantiate UART module
UART uart(.clk(clk),.rst_n(rst_n),.RX(RX),.TX(TX),.rx_rdy(rx_rdy),.clr_rx_rdy(clr_rdy),.rx_data(rx_data),.trmt(trmt),.tx_data(resp),.tx_done(tx_done));
typedef enum logic {IDLE , RCVNG} state_t;
state_t state, nxt_state;
//ff to store upper byte
always_ff @(posedge clk) begin
upperbyte <= (byte_sel)?rx_data:upperbyte;
end
//state ff
always_ff @(posedge clk, negedge rst_n) begin
if(!rst_n)
state <= IDLE;
else
state <= nxt_state;
end
//State Machine
always_comb begin
nxt_state = state ;
set_cmd_rdy = 0;
clr_rdy = 0;
byte_sel = 0;
case (state)
IDLE: begin
if(rx_rdy) begin
byte_sel = 1;
clr_rdy = 1;
nxt_state = RCVNG;
end
end
RCVNG: begin
if(rx_rdy) begin
set_cmd_rdy = 1;
clr_rdy = 1;
nxt_state = IDLE;
end
end
endcase
end
//SR ff for cmd_rdy
always_ff @(posedge clk) begin
if(set_cmd_rdy)
cmd_rdy <= 1;
else if(rx_rdy)
cmd_rdy <= 0;
else if(clr_cmd_rdy)
cmd_rdy <= 0;
end
assign cmd = {upperbyte,rx_data};
endmodule