1

おそらく2つの部分に分かれている質問があります:

8 ビット UART に 4 バイト (つまり、バイナリ データ) として書き込みたい (通常は 32 ビット) 整数変数を使用しています。

つまり、変数 Count : 0 から 2147483647 までの整数範囲。

UART コードで期待されるように、32 ビット整数変数を 4 つの個別の 8 ビット std_logic_vectors に切り刻むにはどうすればよいですか? また、これらを一度に 1 バイトずつ UART に渡すにはどうすればよいですか?

std_logic_vector(to_unsigned(Count, 32)) が整数変数を 32 ビットの std_logic_vector に変換することは承知していますが、その後はどうでしょうか? 32 ビットの std_logic_vector を作成し、変換された Count 値をそれに割り当ててから、次のコードのようなものを使用して分割する必要がありますか? 以下は、カウント変数が4クロックサイクル中に変化しないと仮定し、UARTがクロックサイクルごとに新しいバイトを受け入れることができ、4バイト送信サイクルを再トリガーする手段がないことを前提としていますが、私は正しいですかここで追跡しますか、それとももっと良い方法がありますか?

variable CountOut  : std_logic_vector(31 downto 0);

process (clock)

   variable Index : integer range 0 to 4 := 0;

   begin

   if rising_edge(clock) then

      CountOut <= std_logic_vector(to_unsigned(Count, 32);

      if (Index = 0) then
         UartData(7 downto 0) <= CountOut(31 downto 24);
         Index := 1;
      elsif (Index = 1) then
         UartData(7 downto 0) <= CountOut(23 downto 16);
         Index := 2;
      elsif (Index = 2) then
         UartData(7 downto 0) <= CountOut(15 downto 8);
         Index := 3;
      elsif (Index =31) then
         UartData(7 downto 0) <= CountOut(7 downto 0);
         Index := 4;
      else
         Index := Index;
      end if;

   end if;

end process;

コメントや推奨事項をいただければ幸いです。

ありがとう、

マイアウ。

4

2 に答える 2

1

あなたは正しい軌道に乗っているようです。この問題には 2 つの基本的な解決策があると思います。

  1. 出力値を 32 ビット ベクトルとして登録し、出力操作ごとに異なる範囲を使用します (コード例で行ったように)。
  2. 出力値を 32 ビットのベクトルとして登録し、各出力操作の後にこの値を一度に 8 ビットずつシフトします。このようにして、すべての操作で同じ範囲を使用できます。以下のコードは、あなたのアイデアを与える必要があります:
process (clock)
   variable Index: integer range 0 to 4 := 0;
begin
   if rising_edge(clock) then      
      if (Index = 0) then
         CountOut <= std_logic_vector(to_unsigned(Count, 32));
         Index := Index + 1;
      elsif (Index < 4) then
         UartData <= CountOut(31 downto 24);
         CountOut <= CountOut sll 8;
         Index := Index + 1;
      end if;
   end if;
end process;

また、割り当てを確認してください。例では、CountOut は変数として宣言されていますが、シグナルとして割り当てられています。

于 2013-09-22T21:56:07.400 に答える
0

あなたが示したコードに問題はありません。Index を使用してループを許可することで、UartData への割り当てを分離することができます。

library ieee;
use ieee.std_logic_1164.all;

entity union is
end entity;

architecture foo of union is
    type union32 is array (integer range 1 to 4) of std_logic_vector(7 downto 0);
    signal UartData:    std_logic_vector(7 downto 0);
begin

TEST:
    process 
    variable quad:    union32;
    constant fourbytes:    std_logic_vector(31 downto 0) := X"deadbeef";
    begin

        quad := union32'(fourbytes(31 downto 24), fourbytes(23 downto 16),
                         fourbytes(15 downto 8),fourbytes(7 downto 0));

        for i in union32'RANGE loop
            wait for 9.6 us;
            UartData <= Quad(i);
        end loop; 

        wait for 9.6 us;  -- to display the last byte
        wait;  -- one ping only
    end process;
end architecture; 

インデックスによってアクセスされたバイト

または、型変換関数を使用して複雑さを隠します。

library ieee;
use ieee.std_logic_1164.all;

entity union is
    type union32 is array (integer range 1 to 4) of std_logic_vector(7 downto 0);
end entity;

architecture fee of union is

    signal UartData:    std_logic_vector(7 downto 0);

    function toquad (inp: std_logic_vector(31 downto 0)) return union32 is
    begin
        return union32'(inp(31 downto 24), inp(23 downto 16),
                        inp(15 downto 8),  inp( 7 downto 0));
    end function;
begin

TEST:
    process 
    variable quad:    union32;
    constant fourbytes:    std_logic_vector(31 downto 0) := X"deadbeef";
    begin

        quad := toquad (fourbytes);

        for i in union32'RANGE loop
            wait for 9.6 us;
            UartData <= Quad(i);
        end loop; 

        wait for 9.6 us;  -- to display the last byte
        wait;  -- one ping only
    end process;
end architecture;

と、同じ答えを返します。

于 2013-09-22T21:43:28.840 に答える