📄 tx16.vhd
字号:
--一次发送8位数据。当start_tx为1时,开始发送8位数据。
--第1位是低电平起始位,以后8位数据位,最后变高电平。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity tx16 is port(
rst : in std_logic;
p1mhz : in std_logic;
data_in : in std_logic_vector(15 downto 0);
tx : out std_logic;
start_tx : in std_logic;
on_tx : out std_logic
);
end entity;
architecture tx of tx16 is
component data_clk is port (
rst : in std_logic;
p1mhz : in std_logic;
can_data_clk : in std_logic;
data_clk : out std_logic
);
end component;
signal data_cnt : integer range 0 to 31;
signal tx_clk : std_logic;
signal en_tx,end_tx : std_logic;
signal t_tx : std_logic;
constant data_cnt_limit : integer := 19;
begin
on_tx <= '1' when en_tx='1' else '0';
tx <= t_tx;
u_data_clk : data_clk port map (
rst => rst,--: in std_logic;
p1mhz => p1mhz,--: in std_logic;
can_data_clk => en_tx,--: in std_logic;
data_clk => tx_clk );--: out std_logic--;
process(rst,end_tx,start_tx)
begin
if rst='0' or end_tx='1' then
en_tx <= '0';
else
if rising_edge(start_tx) then
en_tx <= '1';
end if;
end if;
end process;
process(rst,data_cnt,en_tx,tx_clk)
begin
if rst='0' or en_tx = '0' then
end_tx <= '0';
else
if rising_edge(tx_clk) then
if data_cnt = data_cnt_limit then
end_tx <= '1';
end if;
end if;
end if;
end process;
process(rst,data_in,data_cnt,en_tx,t_tx)
begin
if rst='0' then
t_tx <= '1';
elsif data_cnt = 1 and en_tx='1' then
t_tx <= '0';
elsif data_cnt >= 2 and data_cnt <= data_cnt_limit-2 and en_tx='1' then
t_tx <= data_in(data_cnt-2);
elsif data_cnt >= data_cnt_limit-1 then
t_tx <= '1';
else
t_tx <= '1';
end if;
end process;
process(rst,tx_clk,data_cnt,en_tx)
begin
if rst='0' or en_tx='0' then
data_cnt <= 0;
else
if rising_edge(tx_clk) then
if en_tx='1' then
if data_cnt < data_cnt_limit then
data_cnt <= data_cnt + 1;
end if;
end if;
end if;
end if;
end process;
end architecture;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -