?? send_core.vhd
字號:
-- 庫聲明
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use WORK.SEND_PACKAGE.all;
entity send_core is
generic (
DATA_BIT : integer := 64;-- 數(shù)據(jù)位個數(shù)
TOTAL_BIT : integer := 66;-- 總數(shù)據(jù)個數(shù)(1b起始位,64b數(shù)據(jù),1b校驗位,1b停止位)
PARITY_RULE:PARITY := ODD
);
port (
-- 時鐘信號
clk : in std_logic;
rdclk:out std_logic; -- 讀fifo的時鐘
rdempty:in std_logic; --讀空標志
rdreq:out std_logic;
-- 復(fù)位、使能子模塊的信號
reset_parts : out std_logic;
reset_dt:out std_logic;
ce_parts : out std_logic;
new_data:in std_logic;
-- 和移位寄存器的接口信號
send_si : out std_logic;
-- 計數(shù)器時鐘選擇信號和計數(shù)器計數(shù)到達上閾的指示信號
overflow : in std_logic;
RxD:in std_logic;
-- 輸出選擇信號
sel_out : out std_logic;
parity:in std_logic;
-- dout:out std_logic_vector(5 downto 0);
-- 提供給CPU的接口信號
send_bus : in std_logic_vector(DATA_BIT-1 downto 0)
-- send_bus_2: out std_logic_vector(63 downto 0);
-- send_over : out std_logic
);
end send_core;
architecture send_core of send_core is
-- 內(nèi)部信號
signal state : UART_STATE := UART_IDLE;
signal send_buf : std_logic_vector(67 downto 0);
signal si_count : integer range 0 to 100 := 0;
signal reg6:std_logic_vector(5 downto 0):= (others => '0');
signal rv_count: integer range 0 to 10 :=0;
--signal send_bus_2:std_logic_vector(63 downto 0);
begin
-- 主過程
main: process(clk)
begin
rdclk <= clk;
if rising_edge(clk) then
case state is
when UART_IDLE => -- 空閑狀態(tài)
reset_parts <= '0';-- 復(fù)位子模塊
reset_dt <= '0';
ce_parts <= '0'; -- 子模塊使能無效
-- if new_data = '0' then
if (rdempty ='0')then
rdreq <= '1' ;
sel_out <= '0'; -- 使得輸出保持為'1'
si_count <= TOTAL_BIT-1;-- 初始化串行加載序列的索引變量
state <= UART_LOAD;-- 改變狀態(tài)為加載
else
state <= UART_IDLE;
end if;
-- else
-- state <= RECV_DETECT;
-- end if;
-------- 數(shù)據(jù)加載和發(fā)送狀態(tài)--------
when UART_LOAD => -- 加載狀態(tài)
-- send_bus_2 <=send_bus;
rdreq <= '0';
if overflow = '1' then -- 如果overflow信號為'1',表示數(shù)據(jù)加載完成
sel_out <= '0'; -- 使得輸出保持為'1'
reset_parts <= '0';-- 復(fù)位子模塊
ce_parts <= '0'; -- 子模塊使能信號無效
state <= UART_SEND;-- 改變狀態(tài)為發(fā)送
else
if not(si_count = TOTAL_BIT-1) then -- 通過增加si_count,
si_count <= si_count+1; --生成串行加載序列
else
si_count <= 0;
end if;
reset_parts <= '1'; -- 子模塊復(fù)位信號無效
ce_parts <= '1'; -- 子模塊使能信號有效
end if;
when UART_SEND => -- 發(fā)送狀態(tài)
sel_out <= '1'; -- 選擇輸出為TxD
if overflow = '1' then -- 如果overflow為'1',表示發(fā)送完成
-- send_over <= '1'; -- 輸出發(fā)送完成的指示信號
sel_out <= '0';
reset_dt <= '1';
state <= RECV_DETECT;-- 改變狀態(tài)為發(fā)送完成
else
reset_parts <= '1'; -- 子模塊復(fù)位信號無效
ce_parts <= '1'; -- 子模塊使能信號有效
end if;
when RECV_DETECT =>
reset_dt <= '1';
-- send_over <= '0'; -- 恢復(fù)發(fā)送完成指示信號
reset_parts <= '1'; -- 子模塊復(fù)位信號無效
ce_parts <= '1'; -- 子模塊使能信號有效
if new_data = '1' then
rv_count <= 0;
reset_dt <= '0';
state <= RECV;
-- state <= UART_END_SEND;
else
state <= RECV_DETECT;
end if;
when RECV =>
reset_parts <= '1'; -- 子模塊復(fù)位信號無效
ce_parts <= '1'; -- 子模塊使能信號有效
if not(rv_count = 4) then
reg6(5 downto 1) <= reg6(4 downto 0) ;
reg6(0) <= RxD;
rv_count <= rv_count +1;
else
state <= CHECK;
end if;
when CHECK =>
reset_parts <= '1'; -- 子模塊復(fù)位信號無效
ce_parts <= '1'; -- 子模塊使能信號有效
case reg6 is
when "000000" => --接收正確
reg6 <= "000000";
-- dout <= reg6;
state <= UART_END_SEND;
when "000001" => --接收錯誤,重發(fā)
-- dout <= reg6;
reg6 <= "000000";
reset_parts <= '0';-- 復(fù)位子模塊
reset_dt <= '0';
ce_parts <= '0'; -- 子模塊使能無效
sel_out <= '0'; -- 使得輸出保持為'1'
si_count <= TOTAL_BIT-1;-- 初始化串行加載序列的索引變量
state <= UART_LOAD;
when "000010" => --接收FIFO滿,等待
-- dout <= reg6;
reg6 <= "000000";
reset_dt <= '1';
state <= RECV_DETECT;
when others =>
-- dout <= reg6;
reg6 <= "000000";
state <= UART_END_SEND;
end case;
when UART_END_SEND => -- 發(fā)送完成狀態(tài)
ce_parts <= '0'; -- 子模塊使能信號無效
-- send_over <= '0'; -- 恢復(fù)發(fā)送完成指示信號
state <= UART_IDLE; -- 改變狀態(tài)為空閑
end case;
end if;
end process;
-- 生成串行加載序列 (奇偶校驗)
send_buffer: process(send_bus,parity)
begin
send_buf(0) <= '0'; -- 存儲起始位
send_buf(64 downto 1) <= send_bus(63 downto 0);-- 存儲數(shù)據(jù)位
if PARITY_RULE = ODD or PARITY_RULE = EVEN then
send_buf(65) <= parity;
send_buf(67 DOWNTO 66) <= (others => '1');
else
send_buf(67 DOWNTO 65) <= (others => '1');
end if;
end process;
-- 串行輸入選擇
si_switch: process(si_count)
begin
if (si_count < TOTAL_BIT ) then
send_si <= send_buf(si_count);-- 將send_buf里面的數(shù)據(jù)送到send_si端口上
else
send_si <= '1';
end if;
end process;
end send_core;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -