📄 coreuart.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
COREUART
(
RESET_N
,
CLK
,
WEN
,
OEN
,
CSN
,
DATA_IN
,
RX
,
BAUD_VAL
,
BIT8
,
PARITY_EN
,
ODD_N_EVEN
,
PARITY_ERR
,
OVERFLOW
,
TXRDY
,
RXRDY
,
DATA_OUT
,
TX
)
;
parameter
TX_FIFO
=
0
;
parameter
RX_FIFO
=
0
;
parameter
FAMILY
=
15
;
input
RESET_N
;
input
CLK
;
input
WEN
;
input
OEN
;
input
CSN
;
input
[
7
:
0
]
DATA_IN
;
input
RX
;
input
[
7
:
0
]
BAUD_VAL
;
input
BIT8
;
input
PARITY_EN
;
input
ODD_N_EVEN
;
output
PARITY_ERR
;
output
OVERFLOW
;
output
TXRDY
;
output
RXRDY
;
output
[
7
:
0
]
DATA_OUT
;
output
TX
;
`define CUARTl0II \
2 \
'b \
00
`define CUARTO1II \
2 \
'b \
01
`define CUARTI1II \
2 \
'b \
10
`define CUARTl1II \
2 \
'b \
11
wire
PARITY_ERR
;
wire
OVERFLOW
;
wire
CUARTOOlI
;
wire
TXRDY
;
reg
RXRDY
;
wire
CUARTIOlI
;
wire
CUARTlOlI
;
wire
fifo_write
;
reg
[
7
:
0
]
DATA_OUT
;
wire
TX
;
wire
xmit_pulse
;
wire
baud_clock
;
wire
rst_tx_empty
;
reg
[
7
:
0
]
tx_hold_reg
;
wire
[
7
:
0
]
tx_dout_reg
;
wire
[
7
:
0
]
CUARTOIlI
;
wire
read_rx_byte
;
reg
[
7
:
0
]
CUARTIIlI
;
wire
[
7
:
0
]
rx_byte
;
wire
[
7
:
0
]
CUARTlIlI
;
wire
CUARTOllI
;
wire
CUARTIllI
;
reg
CUARTlllI
;
reg
CUARTO0lI
;
wire
fifo_read_tx
;
wire
CUARTI0lI
;
wire
CUARTl0lI
;
wire
clear_parity
;
wire
clear_parity_en
;
reg
CUARTO1lI
;
reg
CUARTI1lI
;
reg
CUARTl1lI
;
reg
CUARTOO0I
;
reg
CUARTIO0I
;
reg
CUARTlO0I
;
reg
CUARTOI0I
;
reg
[
1
:
0
]
CUARTO10
;
reg
[
1
:
0
]
CUARTII0I
;
always
@
(
posedge
CLK
or
negedge
RESET_N
)
begin
:
CUARTlI0I
if
(
RESET_N
==
1
'b
0
)
begin
tx_hold_reg
<=
{
8
{
1
'b
0
}
}
;
CUARTO0lI
<=
1
'b
1
;
end
else
begin
CUARTO0lI
<=
1
'b
1
;
if
(
CSN
==
1
'b
0
&
WEN
==
1
'b
0
)
begin
tx_hold_reg
<=
DATA_IN
;
CUARTO0lI
<=
1
'b
0
;
end
end
end
assign
rst_tx_empty
=
WEN
==
1
'b
0
&
CSN
==
1
'b
0
?
1
'b
1
:
1
'b
0
;
always
@
(
rx_byte
or
CUARTIIlI
or
PARITY_ERR
)
begin
if
(
RX_FIFO
==
1
'b
0
)
begin
DATA_OUT
=
rx_byte
;
end
else
begin
if
(
PARITY_ERR
==
1
'b
1
)
begin
DATA_OUT
=
rx_byte
;
end
else
begin
DATA_OUT
=
CUARTIIlI
;
end
end
end
assign
read_rx_byte
=
(
RX_FIFO
==
1
'b
0
)
?
(
(
CSN
==
1
'b
0
&
OEN
==
1
'b
0
)
?
1
'b
1
:
1
'b
0
)
:
!
CUARTl0lI
;
assign
clear_parity
=
(
RX_FIFO
==
1
'b
0
)
?
(
(
CSN
==
1
'b
0
&
OEN
==
1
'b
0
)
?
1
'b
1
:
1
'b
0
)
:
CUARTI1lI
;
assign
CUARTlIlI
=
(
PARITY_ERR
==
1
'b
0
)
?
rx_byte
:
8
'b
0
;
always
@
(
CUARTIOlI
or
CUARTOI0I
)
begin
if
(
RX_FIFO
==
1
'b
0
)
begin
RXRDY
=
CUARTIOlI
;
end
else
begin
RXRDY
=
!
CUARTOI0I
;
end
end
always
@
(
posedge
CLK
or
negedge
RESET_N
)
begin
if
(
RESET_N
==
1
'b
0
)
begin
CUARTI1lI
<=
1
'b
0
;
end
else
begin
CUARTO1lI
<=
clear_parity_en
;
CUARTI1lI
<=
CUARTO1lI
;
end
end
always
@
(
posedge
CLK
or
negedge
RESET_N
)
begin
if
(
RESET_N
==
1
'b
0
)
begin
CUARTO10
<=
`CUARTl0II
;
end
else
begin
CUARTO10
<=
CUARTII0I
;
end
end
always
@
(
CUARTO10
,
CUARTOI0I
,
CUARTIllI
)
begin
CUARTII0I
=
CUARTO10
;
CUARTlllI
=
1
'b
1
;
CUARTIO0I
=
1
'b
0
;
case
(
CUARTO10
)
`CUARTl0II
:
if
(
CUARTOI0I
==
1
'b
1
&&
CUARTIllI
==
1
'b
0
)
begin
CUARTII0I
=
`CUARTO1II
;
CUARTlllI
=
1
'b
0
;
end
`CUARTO1II
:
CUARTII0I
=
`CUARTI1II
;
`CUARTI1II
:
CUARTII0I
=
`CUARTl1II
;
`CUARTl1II
:
begin
CUARTII0I
=
`CUARTl0II
;
CUARTIO0I
=
1
'b
1
;
end
endcase
end
always
@
(
posedge
CLK
or
negedge
RESET_N
)
begin
if
(
RESET_N
==
1
'b
0
)
begin
CUARTIIlI
<=
{
8
{
1
'b
0
}
}
;
end
else
begin
if
(
CUARTIO0I
==
1
'b
1
)
begin
CUARTIIlI
<=
CUARTOIlI
;
end
end
end
always
@
(
posedge
CLK
or
negedge
RESET_N
)
begin
if
(
RESET_N
==
1
'b
0
)
begin
CUARTOI0I
<=
1
'b
1
;
end
else
begin
if
(
CUARTIO0I
==
1
'b
1
)
begin
CUARTOI0I
<=
1
'b
0
;
end
else
begin
if
(
CSN
==
1
'b
0
&&
OEN
==
1
'b
0
)
begin
CUARTOI0I
<=
1
'b
1
;
end
end
end
end
assign
OVERFLOW
=
(
RX_FIFO
==
1
'b
0
)
?
CUARTOOlI
:
CUARTl0lI
;
assign
CUARTlOlI
=
PARITY_ERR
?
1
'b
1
:
fifo_write
;
Clock_gen
CUARTOl0I
(
.clk
(
CLK
)
,
.reset_n
(
RESET_N
)
,
.baud_val
(
BAUD_VAL
)
,
.baud_clock
(
baud_clock
)
,
.xmit_pulse
(
xmit_pulse
)
)
;
Tx_async
#
(
.TX_FIFO
(
TX_FIFO
)
)
CUARTIl0I
(
.clk
(
CLK
)
,
.xmit_pulse
(
xmit_pulse
)
,
.reset_n
(
RESET_N
)
,
.rst_tx_empty
(
rst_tx_empty
)
,
.tx_hold_reg
(
tx_hold_reg
)
,
.tx_dout_reg
(
tx_dout_reg
)
,
.fifo_empty
(
CUARTOllI
)
,
.fifo_full
(
CUARTI0lI
)
,
.bit8
(
BIT8
)
,
.parity_en
(
PARITY_EN
)
,
.odd_n_even
(
ODD_N_EVEN
)
,
.txrdy
(
TXRDY
)
,
.tx
(
TX
)
,
.fifo_read_tx
(
fifo_read_tx
)
)
;
Rx_async
#
(
.RX_FIFO
(
RX_FIFO
)
)
CUARTll0I
(
.clk
(
CLK
)
,
.baud_clock
(
baud_clock
)
,
.reset_n
(
RESET_N
)
,
.bit8
(
BIT8
)
,
.parity_en
(
PARITY_EN
)
,
.odd_n_even
(
ODD_N_EVEN
)
,
.read_rx_byte
(
read_rx_byte
)
,
.clear_parity
(
clear_parity
)
,
.rx
(
RX
)
,
.overflow
(
CUARTOOlI
)
,
.parity_err
(
PARITY_ERR
)
,
.clear_parity_en
(
clear_parity_en
)
,
.receive_full
(
CUARTIOlI
)
,
.rx_byte
(
rx_byte
)
,
.fifo_write
(
fifo_write
)
)
;
generate
if
(
TX_FIFO
==
1
'b
1
)
begin
fifo_256x8
tx_fifo
(
.DO
(
tx_dout_reg
)
,
.RCLOCK
(
CLK
)
,
.WCLOCK
(
CLK
)
,
.DI
(
DATA_IN
)
,
.WRB
(
CUARTO0lI
)
,
.RDB
(
fifo_read_tx
)
,
.RESET
(
RESET_N
)
,
.FULL
(
CUARTI0lI
)
,
.EMPTY
(
CUARTOllI
)
)
;
end
endgenerate
generate
if
(
RX_FIFO
==
1
'b
1
)
begin
fifo_256x8
rx_fifo
(
.DO
(
CUARTOIlI
)
,
.RCLOCK
(
CLK
)
,
.WCLOCK
(
CLK
)
,
.DI
(
CUARTlIlI
)
,
.WRB
(
CUARTlOlI
)
,
.RDB
(
CUARTlllI
)
,
.RESET
(
RESET_N
)
,
.FULL
(
CUARTl0lI
)
,
.EMPTY
(
CUARTIllI
)
)
;
end
endgenerate
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -