Я пытаюсь спроектировать приемник rs232 в VHDL: я посылаю числа с помощью скрипта на python, которые он должен перехватить и показать некоторым светодиодам.Я надеюсь, что понял, как работает RS232, и приступил к работе над этим проектом.Дизайн не ведет себя так, как я надеюсь, и мне интересно, может ли кто-нибудь помочь мне определить мои ошибки.
Конечно, я пошел посмотреть, как работает последовательный приемник.Но, как начинающий, я часто чувствую себя подавленным предложенным решением (пример: VHDL RS-232 Receiver"или даже хуже: https://www.nandland.com/vhdl/modules/module-uart-serial-port-rs232.html), мне не хватает словарного запаса и опыта, чтобы понять, что происходиттам.
Я сделал этот дизайн для веб-издания Quartus II:
сущность внизу просто привязывается к любым данным, поступающим через ввод rs232, чтобы убедиться, что скрипт Python действительночто-то делать.
с этими двумя файлами: rs232_test
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity rs232_receiver is
port (
clock : in std_logic;
r : in std_logic;
reset : in std_logic;
data : out std_logic_vector (7 downto 0)
);
end rs232_receiver;
architecture rs232_receiver_arch of rs232_receiver is
signal data_buffer : std_logic_vector (12 downto 0);
signal state : integer; -- 1000 => idle;
begin
process
begin
wait until rising_edge (clock);
if (reset = '0') then
if (state = 1000) then
if (r = '0') then
state <= 0; -- startbit as been detected => time to READ !
end if;
elsif (state < 13 and state > -1) then
data_buffer(state) <= r;
state <= state + 1;
else
state <= 1000; -- go back to idle
data <= data_buffer(7 downto 0);
data_buffer <= (others => '0');
end if;
else
data_buffer <= (others => '0');
data <= (others => '0');
state <= 1000;
end if;
end process;
end rs232_receiver_arch;
настройка часов (необработанные часы - 24 МГц, я надеюсь, что, как я сделал этот делитель, выходной сигнал составляет 1200 Гц, то есть яповерьте, скорость передачи 1200).
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity div1000 is
port (
clock : in std_logic;
clockOut : out std_logic
);
end div1000;
architecture div1000_arch of div1000 is
signal count : integer;
begin
clockOut <= '1' when count < 10000 else '0';
process begin
wait until rising_edge (clock);
if (count > 19999 or count < 0) then
count <= 1;
else
count <= count + 1;
end if;
end process;
end div1000_arch;
Я загружаю число с помощью этого скрипта Python:
# -*- coding: utf-8 -*-
"""
Created on Thu May 2 14:52:12 2019
@author: nathan hj ragot
"""
import time
import serial
import serial.tools.list_ports
print ("hello world !")
# initialisation des variables
port = "" # port choisit
ports = [] # ports listes
# recherche et choix du port
print ("merci de rentrer le nom d'un port :")
print ("ps : automatiquement, le script a detecte ces ports :")
print ("**************")
ports = serial.tools.list_ports.comports()
for i in range (len(ports)):
print ("-> [" + str(i) + "] : " + str (ports[i]))
print ("**************")
port = input("? votre choix :")
print ("ok cool")
# open serial port
ser = serial.Serial(
port=port,
baudrate=1200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_TWO,
bytesize=serial.EIGHTBITS
)
print(ser.isOpen())
#start writing
ser.write(bytearray([255]))
for i in range(15):
input("press enter to print " + str(i))
ser.write (bytearray([i]))
#stop writing
ser.close()
print(ser.isOpen())
print ("bye")
Я ожидал, что каждый раз, когда я нажимаю клавишу ввода на клавиатуре, скрипт Pythonбудет посылать байт моей плате fpga, и дизайн будет фиксировать число и показывать его светодиодам. Вместо этого светодиоды мигают в некоторых случайных местах, которые не соответствуют отправленному числу, а затемДиатли выключи.