?? uart_core.vhd
字號(hào):
-- 庫(kù)聲明
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use WORK.UART_PACKAGE.all;
entity uart_core is
generic (
-- 數(shù)據(jù)位個(gè)數(shù)
DATA_BIT : integer := 8;
-- 總數(shù)據(jù)個(gè)數(shù)
TOTAL_BIT : integer := 10;
-- 奇偶校驗(yàn)規(guī)則
PARITY_RULE : PARITY := NONE );
port (
-- 時(shí)鐘和復(fù)位信號(hào)
clk : in std_logic;
reset_n : in std_logic;
-- 和信號(hào)監(jiān)測(cè)器的接口信號(hào)
new_data : in std_logic;
reset_dt : out std_logic;
-- 復(fù)位、使能子模塊的信號(hào)
reset_parts : out std_logic;
ce_parts : out std_logic;
-- 和移位寄存器的接口信號(hào)
send_si : out std_logic;
sel_si : out std_logic;
regs : in std_logic_vector(TOTAL_BIT-1 downto 0);
-- 計(jì)數(shù)器時(shí)鐘選擇信號(hào)和計(jì)數(shù)器計(jì)數(shù)到達(dá)上閾的指示信號(hào)
sel_clk : out std_logic;
overflow : in std_logic;
-- 和奇偶校驗(yàn)器的接口信號(hào)
sel_pv : out std_logic;
parity : in std_logic;
-- 輸出選擇信號(hào)
sel_out : out std_logic;
-- 提供給CPU的接口信號(hào)
send : in std_logic;
send_bus : in std_logic_vector(DATA_BIT-1 downto 0);
send_over : out std_logic;
recv : out std_logic;
recv_bus : out std_logic_vector(DATA_BIT-1 downto 0);
error : out std_logic );
end uart_core;
architecture uart_core of uart_core is
-- 內(nèi)部信號(hào)
signal state : UART_STATE := UART_IDLE;
signal send_buf : std_logic_vector(TOTAL_BIT-1 downto 0);
signal si_count : integer range 0 to 15 := 0;
begin
-- 主過程
main: process(clk, reset_n)
begin
if reset_n = '0' then
-- 信號(hào)監(jiān)測(cè)器復(fù)位信號(hào)
reset_dt <= '1';
-- 其他模塊的復(fù)位和使能信號(hào)
reset_parts <= '0';
ce_parts <= '0';
-- 移位寄存器輸入
sel_si <= '0';
-- 波特率發(fā)生器和計(jì)數(shù)器的時(shí)鐘選擇信號(hào)
sel_clk <= '0';
-- 奇偶校驗(yàn)器的輸入
sel_pv <= '0';
-- 選擇TxD輸出
sel_out <= '0';
-- 與CPU之間的接口信號(hào)
send_over <= '0';
recv <= '0';
error <= '0';
recv_bus <= (others => '0');
-- 狀態(tài)機(jī)
state <= UART_IDLE;
-- 串行加載的計(jì)數(shù)
si_count <= 0;
elsif rising_edge(clk) then
case state is
-- 空閑狀態(tài)
when UART_IDLE =>
-- 當(dāng)信號(hào)監(jiān)測(cè)器監(jiān)測(cè)到數(shù)據(jù)時(shí),new_data變?yōu)?#039;1'
if new_data = '1' then
-- 復(fù)位子模塊
reset_parts <= '0';
-- 子模塊使能無效
ce_parts <= '0';
-- 選擇移位寄存器串行輸入為RxD
sel_si <= '1';
-- 選擇移位寄存器的時(shí)鐘為波特率始終
-- 選擇計(jì)數(shù)器的時(shí)鐘為波特率發(fā)生器的指示信號(hào)
sel_clk <= '0';
-- 使得輸出保持為'1'
sel_out <= '0';
-- 設(shè)置奇偶校驗(yàn)的數(shù)據(jù)源為數(shù)據(jù)發(fā)送總線
sel_pv <= '1';
-- 改變狀態(tài)為接收
state <= UART_RECV;
-- 當(dāng)send信號(hào)變?yōu)?#039;1',表示CPU要求發(fā)送數(shù)據(jù)
elsif send = '1' then
-- 復(fù)位子模塊
reset_parts <= '0';
-- 子模塊使能無效
ce_parts <= '0';
-- 選擇移位寄存器串行輸入為串行加載序列
sel_si <= '0';
-- 選擇移位寄存器的時(shí)鐘為波特率始終
-- 選擇計(jì)數(shù)器的時(shí)鐘為波特率發(fā)生器的指示信號(hào)
sel_clk <= '0';
-- 使得輸出保持為'1'
sel_out <= '0';
-- 設(shè)置奇偶校驗(yàn)的數(shù)據(jù)源為數(shù)據(jù)發(fā)送總線
sel_pv <= '0';
-- 初始化串行加載序列的索引變量
si_count <= TOTAL_BIT-1;
-- 改變狀態(tài)為加載
state <= UART_LOAD;
else
-- 停止對(duì)信號(hào)監(jiān)測(cè)器的復(fù)位
reset_dt <= '1';
end if;
-------- 數(shù)據(jù)加載和發(fā)送狀態(tài)--------
-- 加載狀態(tài)
when UART_LOAD =>
-- 如果overflow信號(hào)為'1',表示數(shù)據(jù)加載完成
if overflow = '1' then
-- 復(fù)位子模塊
reset_parts <= '0';
-- 子模塊使能信號(hào)無效
ce_parts <= '0';
-- 選擇移位寄存器串行輸入為串行加載序列
sel_si <= '0';
-- 選擇移位寄存器的時(shí)鐘為波特率始終
-- 選擇計(jì)數(shù)器的時(shí)鐘為波特率發(fā)生器的指示信號(hào)
sel_clk <= '0';
-- 使得輸出保持為'1'
sel_out <= '0';
-- 設(shè)置奇偶校驗(yàn)的數(shù)據(jù)源為數(shù)據(jù)發(fā)送總線
sel_pv <= '0';
-- 改變狀態(tài)為發(fā)送
state <= UART_SEND;
else
-- 選擇移位寄存器的時(shí)鐘為系統(tǒng)時(shí)鐘
-- 選擇計(jì)數(shù)器的時(shí)鐘為系統(tǒng)時(shí)鐘
sel_clk <= '1';
-- 通過增加si_count,生成串行加載序列
if not(si_count = TOTAL_BIT-1) then
si_count <= si_count+1;
else
si_count <= 0;
end if;
-- 子模塊復(fù)位信號(hào)無效
reset_parts <= '1';
-- 子模塊使能信號(hào)有效
ce_parts <= '1';
end if;
-- 發(fā)送狀態(tài)
when UART_SEND =>
-- 選擇輸出為TxD
sel_out <= '1';
-- 如果overflow為'1',表示發(fā)送完成
if overflow = '1' then
-- 輸出發(fā)送完成的指示信號(hào)
send_over <= '1';
-- 改變狀態(tài)為發(fā)送完成
state <= UART_END_SEND;
else
-- 子模塊復(fù)位信號(hào)無效
reset_parts <= '1';
-- 子模塊使能信號(hào)有效
ce_parts <= '1';
end if;
-- 發(fā)送完成狀態(tài)
when UART_END_SEND =>
-- 子模塊使能信號(hào)無效
ce_parts <= '0';
-- 復(fù)位信號(hào)監(jiān)測(cè)器
reset_dt <= '0';
-- 恢復(fù)發(fā)送完成指示信號(hào)
send_over <= '0';
-- 改變狀態(tài)為空閑
state <= UART_IDLE;
-------- 數(shù)據(jù)接收狀態(tài)--------
-- 接收狀態(tài)
when UART_RECV =>
-- 如果overflow變?yōu)?quot;1",表示接收完成
if overflow = '1' then
-- 輸出接收指示信號(hào)
recv <= '1';
-- 總線數(shù)據(jù)輸出
recv_bus <= regs(DATA_BIT downto 1);
-- 改變狀態(tài)為接收完成
state <= UART_END_RECV;
else
-- 子模塊復(fù)位信號(hào)無效
reset_parts <= '1';
-- 子模塊使能信號(hào)有效
ce_parts <= '1';
end if;
-- 接收完成狀態(tài)
when UART_END_RECV =>
-- 進(jìn)行奇偶校驗(yàn)
if not(regs(0) = parity) then
error <= '1';
end if;
-- 子模塊使能信號(hào)無效
ce_parts <= '0';
-- 復(fù)位信號(hào)監(jiān)測(cè)器
reset_dt <= '0';
-- 恢復(fù)接收完成指示信號(hào)
recv <= '0';
-- 改變狀態(tài)為空閑
state <= UART_IDLE;
-- 如果產(chǎn)生未知狀態(tài),輸出錯(cuò)誤信息
when others =>
error <= '1';
-- 恢復(fù)到空閑狀態(tài)
state <= UART_IDLE;
end case;
end if;
end process;
-- 生成串行加載序列
send_buffer: process(send_bus, parity)
begin
-- 存儲(chǔ)起始位
send_buf(0) <= '0';
-- 存儲(chǔ)數(shù)據(jù)位
send_buf(DATA_BIT downto 1) <= send_bus(DATA_BIT-1 downto 0);
-- 存儲(chǔ)奇偶校驗(yàn)位和停止位
if PARITY_RULE = ODD or PARITY_RULE = EVEN then
send_buf(DATA_BIT+1) <= parity;
send_buf(TOTAL_BIT-1 downto DATA_BIT+2) <= (others => '1');
else
send_buf(TOTAL_BIT-1 downto DATA_BIT+1) <= (others => '1');
end if;
end process;
-- 串行輸入選擇
si_switch: process(reset_n, si_count)
begin
-- 復(fù)位
if reset_n = '0' then
send_si <= '1';
else
-- 將send_buf里面的數(shù)據(jù)送到send_si端口上
send_si <= send_buf(si_count);
end if;
end process;
end uart_core;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -