📄 serial_unit.vhd
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use std.textio.all;
entity serial_driver is
generic (filename : string := "testing.txt");
port(
TX : out std_logic;
RX : in std_logic);
end entity;
architecture behave of serial_driver is
signal int_clock : std_logic := '0';
signal clk : std_logic := '0';
begin
clk <= not clk after 4.34 us;
clock_div : process(clk)
-- make internal
variable count : integer := 0;
begin
if(clk'event and (clk'last_value = '0' or clk'last_value = 'L') and
(clk = '1' or clk = 'H')) then
count := count + 1;
end if;
if (count = 6) then
count := 0;
int_clock <= not int_clock;
end if;
end process clock_div;
receive : process(clk, RX)
-- set for n81 and an internal that is 12 times faster than the bit stream
variable clk_count : integer := 0;
variable bit_count : integer := 0;
variable start : boolean := FALSE;
variable tmp_char : integer := 0;
begin
if(clk'event and (clk'last_value = 'L' or clk'last_value = '0') and
(clk = 'H' or clk = '1') and start) then
clk_count := clk_count + 1;
if(clk_count = 12) then
clk_count := 0;
bit_count := bit_count + 1;
end if;
if(clk_count = 2 and bit_count > 0 and bit_count < 9) then
if(RX = '1' or RX = 'H') then
tmp_char := tmp_char + (2**(bit_count-1));
end if;
end if;
if(bit_count = 9) then
-- should check to see if a stop bit was received;
start := FALSE;
report "receive " & character'val(tmp_char);
tmp_char := 0;
bit_count := 0;
end if;
end if;
if(RX'event and (RX'last_value = 'H' or RX'last_value = '1') and
(RX = 'L' or RX = '0') and not start) then
start := TRUE;
end if;
end process receive;
transmit : process
file control : text open read_mode is filename;
variable open_status : file_open_status;
variable read_status : boolean;
variable char_to_send : string(1 to 1);
variable L : line;
variable ascii : integer;
variable tmp_char : character;
variable bit_char : std_logic_vector(1 to 8);
variable clk_count : integer := 0;
variable txing : boolean := FALSE;
variable bit_count : integer := 0;
variable start_up : boolean := FALSE;
begin
wait on int_clock;
if not start_up then
TX <= '1';
wait for 2 ms;
start_up := TRUE;
end if;
-- file_open(status => open_status, f => control,
-- external_name => filename);
if(not txing) then
if(not read_status) then
readline(control, L);
read(L, char_to_send, read_status) ;
else
if(read_status) then
tmp_char := char_to_send(1);
ascii := character'pos(tmp_char);
bit_char := CONV_STD_LOGIC_VECTOR(ascii, 8);
txing := TRUE;
-- report integer'image(ascii);
end if;
read(L, char_to_send, read_status) ;
end if;
if(endfile(control)) then
file_close(f => control);
file_open(status => open_status, f => control,
external_name => filename);
end if;
else
if(int_clock'event and
(int_clock'last_value = '1' or int_clock'last_value = 'H') and
(int_clock = '0' or int_clock = 'L')) then
else
if(bit_count = 0) then
TX <= '0';
end if;
if(bit_count > 0 and bit_count < 9) then
TX <= bit_char(9-bit_count);
end if;
if(bit_count = 9) then
TX <= '1';
end if;
if(bit_count > 9) then
bit_count := 0;
txing := FALSE;
TX <= '1';
end if;
if(txing) then
bit_count := bit_count + 1;
end if;
end if;
end if;
end process transmit;
end architecture;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -