📄 rx_async.v
字号:
// Copyright 2007 Actel Corporation. All rights reserved.
// ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN
// ACCORDANCE WITH THE ACTEL LICENSE AGREEMENT AND MUST BE APPROVED
// IN ADVANCE IN WRITING.
// Rev: 3.0 21FEB07 HJ : v3.0 CoreConsole Release
`timescale 1ns/1ns
module
Rx_async
(
clk
,
baud_clock
,
reset_n
,
bit8
,
parity_en
,
odd_n_even
,
read_rx_byte
,
clear_parity
,
rx
,
overflow
,
parity_err
,
clear_parity_en
,
receive_full
,
rx_byte
,
fifo_write
)
;
parameter
RX_FIFO
=
0
;
input
clk
;
input
baud_clock
;
input
reset_n
;
input
bit8
;
input
parity_en
;
input
odd_n_even
;
input
read_rx_byte
;
input
clear_parity
;
input
rx
;
output
overflow
;
output
parity_err
;
output
clear_parity_en
;
output
receive_full
;
output
[
7
:
0
]
rx_byte
;
output
fifo_write
;
reg
overflow
;
reg
parity_err
;
reg
fifo_write
;
wire
receive_full
;
reg
[
7
:
0
]
rx_byte
;
reg
[
1
:
0
]
CUARTO10
;
reg
[
3
:
0
]
CUARTI10
;
reg
CUARTl10
;
reg
[
8
:
0
]
CUARTOO1
;
reg
CUARTIO1
;
reg
[
3
:
0
]
CUARTlO1
;
reg
CUARTOI1
;
reg
[
2
:
0
]
CUARTII1
;
reg
CUARTlI1
;
reg
clear_parity_en
;
wire
[
1
:
0
]
CUARTOl1
;
wire
[
1
:
0
]
CUARTIl1
;
wire
[
3
:
0
]
CUARTll1
;
parameter
CUARTO01
=
0
;
parameter
CUARTI01
=
1
;
parameter
CUARTl01
=
2
;
always
@
(
posedge
clk
or
negedge
reset_n
)
begin
:
CUARTO11
if
(
reset_n
==
1
'b
0
)
begin
CUARTII1
<=
3
'b
000
;
end
else
begin
if
(
baud_clock
==
1
'b
1
)
begin
CUARTII1
[
1
:
0
]
<=
CUARTII1
[
2
:
1
]
;
CUARTII1
[
2
]
<=
rx
;
end
end
end
always
@
(
CUARTII1
)
begin
case
(
CUARTII1
)
3
'b
000
:
begin
CUARTl10
<=
1
'b
0
;
end
3
'b
001
:
begin
CUARTl10
<=
1
'b
0
;
end
3
'b
010
:
begin
CUARTl10
<=
1
'b
0
;
end
3
'b
011
:
begin
CUARTl10
<=
1
'b
1
;
end
3
'b
100
:
begin
CUARTl10
<=
1
'b
0
;
end
3
'b
101
:
begin
CUARTl10
<=
1
'b
1
;
end
3
'b
110
:
begin
CUARTl10
<=
1
'b
1
;
end
default
:
begin
CUARTl10
<=
1
'b
1
;
end
endcase
end
always
@
(
posedge
clk
or
negedge
reset_n
)
begin
:
CUARTI11
if
(
reset_n
==
1
'b
0
)
begin
CUARTI10
<=
4
'b
0000
;
end
else
begin
if
(
baud_clock
==
1
'b
1
)
begin
if
(
CUARTO10
==
CUARTO01
&
(
CUARTl10
==
1
'b
1
|
CUARTI10
==
4
'b
1000
)
)
begin
CUARTI10
<=
4
'b
0000
;
end
else
begin
CUARTI10
<=
CUARTI10
+
1
'b
1
;
end
end
end
end
always
@
(
posedge
clk
or
negedge
reset_n
)
begin
:
CUARTl11
if
(
reset_n
==
1
'b
0
)
begin
overflow
<=
1
'b
0
;
end
else
begin
if
(
baud_clock
==
1
'b
1
)
begin
if
(
CUARTlI1
==
1
'b
1
)
begin
overflow
<=
1
'b
1
;
end
end
if
(
read_rx_byte
==
1
'b
1
)
begin
overflow
<=
1
'b
0
;
end
end
end
assign
CUARTll1
=
bit8
==
1
'b
0
&
parity_en
==
1
'b
0
?
4
'b
0111
:
bit8
==
1
'b
0
&
parity_en
==
1
'b
1
?
4
'b
1000
:
bit8
==
1
'b
1
&
parity_en
==
1
'b
0
?
4
'b
1000
:
4
'b
1001
;
always
@
(
posedge
clk
or
negedge
reset_n
)
begin
:
CUARTOOOI
if
(
reset_n
==
1
'b
0
)
begin
CUARTO10
<=
CUARTO01
;
rx_byte
<=
8
'b
00000000
;
CUARTlI1
<=
1
'b
0
;
end
else
begin
if
(
baud_clock
==
1
'b
1
)
begin
CUARTlI1
<=
1
'b
0
;
case
(
CUARTO10
)
CUARTO01
:
begin
if
(
CUARTI10
==
4
'b
1000
)
begin
CUARTO10
<=
CUARTI01
;
end
else
begin
CUARTO10
<=
CUARTO01
;
end
end
CUARTI01
:
begin
if
(
CUARTlO1
==
CUARTll1
)
begin
CUARTO10
<=
CUARTl01
;
CUARTlI1
<=
CUARTOI1
;
if
(
CUARTOI1
==
1
'b
0
)
begin
rx_byte
<=
{
(
bit8
&
CUARTOO1
[
7
]
)
,
CUARTOO1
[
6
:
0
]
}
;
end
end
else
begin
CUARTO10
<=
CUARTI01
;
end
end
CUARTl01
:
begin
if
(
CUARTI10
==
4
'b
1111
)
begin
CUARTO10
<=
CUARTO01
;
end
else
begin
CUARTO10
<=
CUARTl01
;
end
end
default
:
begin
CUARTO10
<=
CUARTO01
;
end
endcase
end
end
end
assign
CUARTOl1
=
{
bit8
,
parity_en
}
;
always
@
(
posedge
clk
or
negedge
reset_n
)
begin
:
CUARTIOOI
if
(
reset_n
==
1
'b
0
)
begin
CUARTOO1
[
8
:
0
]
<=
9
'b
000000000
;
CUARTlO1
<=
4
'b
0000
;
end
else
begin
if
(
baud_clock
==
1
'b
1
)
begin
if
(
CUARTO10
==
CUARTO01
)
begin
CUARTOO1
[
8
:
0
]
<=
9
'b
000000000
;
CUARTlO1
<=
4
'b
0000
;
end
else
if
(
CUARTI10
==
4
'b
1111
)
begin
CUARTlO1
<=
CUARTlO1
+
1
'b
1
;
case
(
CUARTOl1
)
2
'b
00
:
begin
CUARTOO1
[
5
:
0
]
<=
CUARTOO1
[
6
:
1
]
;
CUARTOO1
[
6
]
<=
CUARTl10
;
end
2
'b
11
:
begin
CUARTOO1
[
7
:
0
]
<=
CUARTOO1
[
8
:
1
]
;
CUARTOO1
[
8
]
<=
CUARTl10
;
end
default
:
begin
CUARTOO1
[
6
:
0
]
<=
CUARTOO1
[
7
:
1
]
;
CUARTOO1
[
7
]
<=
CUARTl10
;
end
endcase
end
end
end
end
always
@
(
posedge
clk
or
negedge
reset_n
)
begin
:
CUARTlOOI
if
(
reset_n
==
1
'b
0
)
begin
CUARTIO1
<=
1
'b
0
;
end
else
begin
if
(
baud_clock
==
1
'b
1
)
begin
if
(
CUARTI10
==
4
'b
1111
&
parity_en
==
1
'b
1
)
begin
CUARTIO1
<=
CUARTIO1
^
CUARTl10
;
end
if
(
CUARTO10
==
CUARTl01
)
begin
CUARTIO1
<=
1
'b
0
;
end
end
end
end
assign
CUARTIl1
=
{
bit8
,
odd_n_even
}
;
always
@
(
posedge
clk
or
negedge
reset_n
)
begin
:
CUARTOIOI
if
(
reset_n
==
1
'b
0
)
begin
parity_err
<=
1
'b
0
;
end
else
begin
if
(
baud_clock
==
1
'b
1
&
parity_en
==
1
'b
1
&
CUARTI10
==
4
'b
1111
)
begin
case
(
CUARTIl1
)
2
'b
00
:
begin
if
(
CUARTlO1
==
4
'b
0111
)
begin
parity_err
<=
CUARTIO1
^
CUARTl10
;
end
end
2
'b
01
:
begin
if
(
CUARTlO1
==
4
'b
0111
)
begin
parity_err
<=
~
(
CUARTIO1
^
CUARTl10
)
;
end
end
2
'b
10
:
begin
if
(
CUARTlO1
==
4
'b
1000
)
begin
parity_err
<=
CUARTIO1
^
CUARTl10
;
end
end
2
'b
11
:
begin
if
(
CUARTlO1
==
4
'b
1000
)
begin
parity_err
<=
~
(
CUARTIO1
^
CUARTl10
)
;
end
end
default
:
begin
parity_err
<=
1
'b
0
;
end
endcase
end
if
(
clear_parity
==
1
'b
1
)
begin
parity_err
<=
1
'b
0
;
end
end
end
always
@
(
posedge
clk
or
negedge
reset_n
)
begin
:
CUARTIIOI
if
(
reset_n
==
1
'b
0
)
begin
CUARTOI1
<=
1
'b
0
;
fifo_write
<=
1
'b
1
;
clear_parity_en
<=
1
'b
0
;
end
else
begin
fifo_write
<=
1
'b
1
;
clear_parity_en
<=
1
'b
0
;
if
(
baud_clock
==
1
'b
1
)
begin
if
(
bit8
==
1
'b
1
)
begin
if
(
parity_en
==
1
'b
1
)
begin
if
(
CUARTlO1
==
4
'b
1001
&
CUARTO10
==
CUARTI01
)
begin
fifo_write
<=
1
'b
0
;
clear_parity_en
<=
1
'b
1
;
if
(
RX_FIFO
==
1
'b
0
)
begin
CUARTOI1
<=
1
'b
1
;
end
end
end
else
begin
if
(
CUARTlO1
==
4
'b
1000
&
CUARTO10
==
CUARTI01
)
begin
fifo_write
<=
1
'b
0
;
clear_parity_en
<=
1
'b
1
;
if
(
RX_FIFO
==
1
'b
0
)
begin
CUARTOI1
<=
1
'b
1
;
end
end
end
end
else
begin
if
(
parity_en
==
1
'b
1
)
begin
if
(
CUARTlO1
==
4
'b
1000
&
CUARTO10
==
CUARTI01
)
begin
fifo_write
<=
1
'b
0
;
clear_parity_en
<=
1
'b
1
;
if
(
RX_FIFO
==
1
'b
0
)
begin
CUARTOI1
<=
1
'b
1
;
end
end
end
else
begin
if
(
CUARTlO1
==
4
'b
0111
&
CUARTO10
==
CUARTI01
)
begin
fifo_write
<=
1
'b
0
;
clear_parity_en
<=
1
'b
1
;
if
(
RX_FIFO
==
1
'b
0
)
begin
CUARTOI1
<=
1
'b
1
;
end
end
end
end
end
if
(
read_rx_byte
==
1
'b
1
)
begin
CUARTOI1
<=
1
'b
0
;
end
end
end
assign
receive_full
=
CUARTOI1
;
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -