Как можно посылать бит при каждом обновлении счетчика (переменная целочисленного диапазона)? - PullRequest
0 голосов
/ 15 апреля 2019

Я сделал код для моего приемопередатчика I2S в VHDL (простой). Я должен знать, как можно отправить после каждого обновления счетчика 1,2,3 один из 24 битов (24-битного) слова I2S (с коротким оператором). например:

if cnt = 2 => load bit 1 of left channel
if cnt = 3 => load bit 2
if cnt = 25 => load bit 24 of left channel
if cnt = 26 => load bit 1 of right channel
if cnt = 48 => load bit 24 of right channel

Как видите, WS в моем коде выбирает левый или правый канал. В своем тестовом стенде я добавляю тестовое слово (слово 2 x 24 бита).

Это параллельный вход и выход данных (PISO), поэтому он должен быть чем-то вроде регистра сдвига.

В последнее время я изучаю VHDL, потому что я новичок в VHDL, но я не знаю, как это сделать.

Здесь вы можете увидеть мой написанный код. Может быть, это глупый вопрос, но я уже искал весь Интернет. Заранее спасибо за ответ на мой вопрос.

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity Simple_I2S_transceiver_V1 is
generic  (
    DATAWIDTH: integer := 24     
   );

port  
   (
    RST  : in std_logic;
    SCK  : in std_logic;             -- Serial Clock
    BCLK   : in std_logic;             -- Bit Clock
    WS   : inout std_logic;            -- Word Select or Left/Right channel select
    SD     : out std_logic;             -- Serial Data
    PDL  : in std_logic_vector(DATAWIDTH - 1 downto 0);   -- Parallel Data Left
    PDR  : in std_logic_vector(DATAWIDTH - 1 downto 0);   -- Parallel Data Right
    UPD  : inout std_logic;             -- Update data
    READY  : out std_logic;             -- check if data is ready to send (it depends on "VALID")
    VALID  : out std_logic             -- Check if data is valid (length) 
   );

end Simple_I2S_transceiver_V1;

architecture behavior of Simple_I2S_transceiver_V1 is
signal PDL_BUF : std_logic_vector(DATAWIDTH - 1 downto 0);
signal PDR_BUF : std_logic_vector(DATAWIDTH - 1 downto 0);
begin 

process(BCLK)

 -- Declaration of optional variables 
 variable bitcounter  : integer range 0 to 48;

 begin
  -------------------------------------------------
  -- RESET all     
  -------------------------------------------------

  if RST = '1' then
   WS  <= '0';
   SD  <= '0';
   READY <= '0';
   VALID <= '0';
   UPD   <= '0';
   PDL_BUF <= (OTHERS => '0');                                         -- Clear left channel buffer
   PDR_BUF <= (OTHERS => '0');                 -- Clear right channel buffer
      -------------------------------------------------
  -- Set WS / left/right-channel
      -------------------------------------------------

  elsif (BCLK'event and BCLK = '1') then
   PDL_BUF <= PDL;
   PDR_BUF <= PDR;

   bitcounter := bitcounter + 1;

   if bitcounter = 1 then
    UPD <= '1';
   else 
    UPD <= '0';

   if bitcounter >= 1 and bitcounter <= 24 then  
    WS <= '0';
   else
    WS <= '1';
    UPD <= '0'; 

   if WS = '0' then
    SD <= PDL(23);         <-- Parallel load -> it has to be serial load
   elsif WS = '1' then
    SD <= PDR(23);         <-- The same as PDL

   if bitcounter = 48 then
    bitcounter := 0;

   ----------------------------------------------
     -- transmitt data
   ---------------------------------------------- 
   -- add transmission 

     end if;
       end if;
      end if;
    end if;
   end if;
end process;

end behavior;

1 Ответ

0 голосов
/ 15 апреля 2019

Поскольку I2S в первую очередь MSB, сдвиньте влево и используйте MSbit PDx для SD, что-то вроде.

Для левого канала (передача)

SD <= PDL_BUF (23); -- use most significant bit
PDL_BUF <= PDL_BUF (22 downto 0) & '0'; -- 22nd bit becomes 23 and puts a zero into unused bit 0

Аналогично для правого канала.Для получения вы все еще хотите сдвинуть влево тоже.

Извините, я мало что знаю о I2S, но

  1. будьте осторожны при загрузке PDL / PDR, чтобы их нельзя было изменить во время отправки (конечный автомат ) возможно?)
  2. будьте осторожны при отправке данных при одновременной установке высоких тактовых импульсов данных, возможно, вы захотите вывести данные на заднем фронте тактовых импульсов, чтобы данные были правильно зафиксированы напередний край на другой стороне правильно.Вы всегда можете указать время на часах - однако это замедлит скорость передачи данных.
  3. знает, когда переключаться между WS 0 и 1 при передаче
...