Разные способы зачитать из ячейки памяти адреса устройства и ригистра.

This commit is contained in:
sokolovstanislav 2024-06-13 16:27:00 +03:00
parent 072de08545
commit dfe22a8ab2

View File

@ -65,8 +65,28 @@ signal lineBusy : std_logic := '1';
signal start : std_logic := '0';
signal startPrev : std_logic := '0';
signal currentMemoryCell : integer range 0 to ARRAY_LENGTH - 1 := 0;
begin
memoryAddress(0) <= x"30";
memoryAddress(1) <= x"30";
memoryAddress(2) <= x"31";
memoryAddress(3) <= x"31";
memoryAddress(4) <= x"32";
memoryAddress(5) <= x"32";
memoryAddress(6) <= x"33";
memoryAddress(7) <= x"33";
memoryAddress(8) <= x"34";
memoryAddress(9) <= x"34";
memoryAddress(10) <= x"35";
memoryAddress(11) <= x"35";
memoryAddress(12) <= x"36";
memoryAddress(13) <= x"36";
memoryAddress(14) <= x"37";
memoryAddress(15) <= x"37";
process (we, oe, ce)
variable addr : integer range 0 to 2**ADDRESS_BUS_WIDTH - 1 := 0;
variable position : integer range 0 to ARRAY_LENGTH - 1 := 0;
@ -115,8 +135,8 @@ begin
fasBuf(15 downto 8) <= data;
when PB_FILL_ADDRESS_SPACE_LOWER =>
fasBuf(7 downto 0) <= data;
position := conv_integer(data);
memoryAddress(position) <= fasBuf(15 downto 8);
--position := conv_integer(data);
--memoryAddress(position) <= fasBuf(15 downto 8);
when others =>
data <= (others => 'Z'); -- Запретить запись на шину
end case;
@ -125,7 +145,9 @@ begin
end if;
elsif (addr >= conv_integer(firstFreeBuf) and addr <= conv_integer(firstFreeBuf) + conv_integer(cmdBuf(7 downto 0))) then
if (oe = '0') then -- Если сигнал чтения активен
data <= memoryData(addr - conv_integer(firstFreeBuf));
-- data <= memoryData(addr - conv_integer(firstFreeBuf));
data <= memoryAddress(addr - conv_integer(firstFreeBuf)); -- для проверки обратного считывания адреса устройства и адреса регистра.
currentMemoryCell <= addr - conv_integer(firstFreeBuf);
else
data <= (others => 'Z'); -- Запретить запись на шину
end if;
@ -218,13 +240,25 @@ begin
when ReceiveCheck =>
if pback = '0' then
if pbdata = not dataTemp then
memoryData(position) <= dataTemp(15 downto 8);
memoryData(position + 1) <= dataTemp(7 downto 0);
controlBuf <= memoryAddress(position);
-- if currentMemoryCell rem 2 = 0 and currentMemoryCell = position then
-- if currentMemoryCell /= position then
-- memoryData(position) <= dataTemp(15 downto 8);
-- memoryData(position + 1) <= dataTemp(7 downto 0);
-- controlBuf <= memoryAddress(position);
-- if position + 1 < conv_integer(cmdBuf(7 downto 0)) then
-- position := position + 2;
-- else
-- position := 0;
-- circleCounter := circleCounter + 1;
-- end if;
-- end if;
CommunicationState <= Timeout;
count := 0;
pbce <= '1';
countValue := 5;
memoryData(position) <= dataTemp(15 downto 8);
memoryData(position + 1) <= dataTemp(7 downto 0);
controlBuf <= memoryAddress(position);
if position + 1 < conv_integer(cmdBuf(7 downto 0)) then
position := position + 2;
else