Я пытался создать приемник RS-232 с использованием подхода FSM. Я признаю, что у меня нет очень хорошо продуманного понимания VHDL, поэтому я работаю над кодом «на лету» и учась, когда я иду. Тем не менее, я считаю, что на данный момент я ударил кирпичную стену.VHDL RS-232 Receiver
Моя проблема заключается в том, что у меня есть два процесса в моем коде, один для запуска следующего состояния, а другой для выполнения комбинационной логики. Мой код выглядит следующим образом:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity ASyncReceiverV4 is
Port (DataIn : in STD_LOGIC;
Enable : in STD_LOGIC;
CLK : in STD_LOGIC;
BadData : out STD_LOGIC;
DataOut : out STD_LOGIC_VECTOR (7 downto 0));
end ASyncReceiverV4;
architecture Behavioral of ASyncReceiverV4 is
type states is (StartBitCheck, ReadData, StopBitCheck);
signal currentState, nextState : states;
begin
process(CLK)
begin
if rising_edge(CLK) then
currentState <= nextState;
end if;
end process;
process(CLK)
variable counter : integer := 0;
variable dataIndex : integer := 0;
begin
case currentState is
when StartBitCheck =>
if Enable = '1' then
if (DataIn = '0' and counter < 8) then
counter := counter + 1;
elsif (DataIn = '0' and counter = 8) then
BadData <= '0';
nextState <= ReadData;
counter := 0;
else
nextState <= StartBitCheck;
end if;
end if;
when ReadData =>
if Enable = '1' then
if counter < 16 then
counter := counter + 1;
elsif (counter = 16 and dataIndex < 8) then
DataOut(dataIndex) <= DataIn;
counter := 0;
dataIndex := dataIndex + 1;
elsif dataIndex = 8 then
dataIndex := 0;
nextState <= StopBitCheck;
else
nextState <= ReadData;
end if;
end if;
when StopBitCheck =>
if Enable = '1' then
if DataIn = '1' then
if counter < 16 then
counter := counter + 1;
nextState <= StopBitCheck;
elsif counter = 16 then
counter := 0;
nextState <= StartBitCheck;
end if;
else
DataOut <= "11111111";
BadData <= '1';
nextState <= StartBitCheck;
end if;
end if;
end case;
end process;
end Behavioral;
По какой-то причине, на основании моего моделирования, кажется, что мои процессы не синхронизировано. Хотя все должно происходить только на фронте часов, у меня есть переходы, происходящие на заднем фронте. Кроме того, кажется, что вещи не меняются в зависимости от значения счетчика.
Ввод ввода очень высок во всех моих симуляциях. Тем не менее, это просто сохранить его простым на данный момент, он в конечном итоге будет подаваться на выход генератора 153 600 Baud (генератор Baud будет подключен к входу Enable). Следовательно, я хочу, чтобы все изменилось, когда мой генератор Baud высок. В противном случае ничего не делайте. Правильно ли я подхожу к этому коду?
Я могу предоставить скриншот моей симуляции, если это было бы полезно. Я также не уверен, включаю ли я правильные переменные в свой список чувствительности к процессу. Кроме того, правильно ли я использую переменные счетчика и dataIndex? Что делать, если я сделал их сигналами как часть моей архитектуры перед любым из моих процессов?
Любая помощь по этому вопросу была бы очень оценена!
Кто-то должен посмотреть ваш код, чтобы быть уверенным, что вы пишете о UART. Возможно, вы бы попросили на EE Stack Exchange? Это проблема дизайна, а не проблема программирования. – user1155120
Я сделаю это, спасибо! Я видел здесь другие сообщения, касающиеся UART, и думал, что я в нужном месте. – coolDude