-1

ここにprbsのスナップショットを投稿しています

prbs モジュールの私のコードは

-- Module Name:    prbs - Behavioral 
-- Project Name:   modulator

-- Description: 
--To make it of N bit replace existing value of N with desired value of N
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity prbs is
    Port ( pclock : in  STD_LOGIC;
            preset : IN std_logic := '0';
           prbsout : out  STD_LOGIC);
end prbs;

architecture Behavioral of prbs is

COMPONENT dff is
    PORT(
        dclock : IN std_logic;
        dreset : IN std_logic;
        din : IN std_logic ;          
        dout : OUT std_logic 
        );
    END COMPONENT;


signal dintern : std_logic_vector (4 downto 1); --Change value of N to change size of shift register
signal feedback : std_logic := '0';

begin

instdff : dff port map (pclock , preset , feedback , dintern(1));
genreg : for i in 2 to 4 generate --Change Value of N Here to generate that many instance of d flip flop
begin
instdff : dff port map ( pclock , preset , dintern(i-1) , dintern(i));
end generate genreg;

main : process(pclock)

begin
    if pclock'event and pclock = '1' then   
            if preset = '0'  then
                if dintern /= "0" then

                    feedback <= dintern(1) xor dintern(3); -- For N equals four;
                    --feedback <= dintern(4) xor dintern(5) xor dintern(6) xor dintern(8); -- For N equals eight;
                    --feedback <= dintern(11) xor dintern(13) xor dintern(14) xor dintern(16); -- For N equals sixteen;
                    --feedback <= dintern(1) xor dintern(2) xor dintern(22) xor dintern(32); -- For N equals thirty two                     

                else
                feedback <= '1';
                end if;
            end if;                                     
    end if; 
end process main;

prbsout <= dintern(4) ; --Change Value of N Here to take output to top entity 

end Behavioral;

その中で私は広告フリップフロップモジュールをインスタンス化しています

d ff モジュールコード

----------------------------------------------------------------------------------
-- Module Name:    dff - Behavioral 
-- Project Name: 
-- Description: 
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity dff is
    Port ( dclock : in  STD_LOGIC ;
           dreset : in  STD_LOGIC ;
           din : in  STD_LOGIC;
           dout : out  STD_LOGIC);
end dff;

architecture Behavioral of dff is

begin
process(dclock)

begin
    if dclock'event and dclock = '1' then
        if dreset = '0' then
            dout <= din;
      else
            dout <= '1';
        end if;
    end if;
end process;


end Behavioral;

しかし、私は望ましい出力を得ていません。最上位エンティティでは、prbsout 信号で常に 1 になります。

シミュレートしようとすると、prbsout 信号が未定義になります。

私は何が欠けていますか?

4

2 に答える 2

2

おそらく、シグナルの宣言で割り当てられた初期値 0 を使用することが意図されていたため、prbsモジュールのリセット atはシグナルにpreset適用されません。ただし、モジュールは同期リセットを使用し、信号は開始時に駆動されず、xor を使用して次の値が計算されるため、フィードバックは開始直後に未定義になり、長い時間がかかっても回復できません。リセットが適用されます。以下の ModelSim の波形を参照してください。feedbackfeedbackdffdinternUfeedbackdintern(1)

プリセットがフィードバックに適用される前

リセットの問題の即時の修正は、プロセスでfeedbackもリセットを適用することです。main

...
else  -- preset /= '0'
  feedback <= '0';
...

少なくともリセットが機能し、prbsシーケンスを生成できるようになりました。以下の波形を参照してください。

プリセットがフィードバックに適用された後

コードにいくつかのコメントを追加します。

  • 代わりにdclock'event and dclock = '1'を使用できますrising_edge(dclock)。これにより、読者は理解しやすくなり、エラーが発生しにくくなります。

  • ほとんどのツールでは、モジュールのようにフリップフロップ専用の別のモジュールを作成する必要はありません。これはdff、信号の割り当てに高度な式が使用されている場合でも、ツールがプロセスからフリップフロップを直接推測できるためです。

しかし、出力が実際に欲しいものではないと思います。設計と LFSR 用に選択されたタップに基づいて、最大長の LFSR シーケンスを生成する必要があるように見えます。これは、長さが N ビットの LFSR レジスタに対して長さが 2 ** N - 1 のシーケンスです。

LFSR の原理とフィードバック生成のためのタップについては、ウィキペディア: Linear feedback shift registerで説明されています。

ただし、feedback信号はフリップフロップとして生成されるため、LSFR シフト レジスタの一部になり、長さにビットが追加されますが、タップ値は LFSR の一部のみに基づいているためdintern、タップは正しくありません。間違ったビットを選択すると、最大シーケンスよりも少ない LFSR シーケンスが生成されます。シミュレーション出力では、シーケンスの長さが 6 サイクルしかなく、dintern(4 downto 1)+feedbackを一緒に使用しても 5 ビット レジスタになることがわかります。

prbsそのため、最大長の PRBS シーケンスを生成する必要がある場合は、モジュールをより完全に書き直す必要があります。以下に、prbsモジュールの記述方法の例を示します。

library ieee;
use ieee.std_logic_1164.all;

entity prbs_new is
  generic(
    BITS : natural);
  port(
    clk_i  : in  std_logic;
    rst_i  : in  std_logic;
    prbs_o : out std_logic);
end entity;


library ieee;
use ieee.numeric_std.all;

architecture syn of prbs_new is

  signal lfsr : std_logic_vector(BITS downto 1);  -- Flip-flops with LFSR state

  function feedback(slv : std_logic_vector) return std_logic is  -- For maximum length LFSR generation
  begin
    case slv'length is
      when  3     => return slv( 3) xor slv( 2);
      when  4     => return slv( 4) xor slv( 3);
      when  8     => return slv( 8) xor slv( 6) xor slv( 5) xor slv(4);
      when 16     => return slv(16) xor slv(15) xor slv(13) xor slv(4);
      when 32     => return slv(32) xor slv(22) xor slv( 2) xor slv(1);
      when others => report "feedback function not defined for slv'lenght as " & integer'image(slv'length)
                     severity FAILURE;
                     return 'X';
    end case;
  end function;

begin

  process (clk_i, rst_i) is
  begin
    if rising_edge(clk_i) then
      if unsigned(lfsr) /= 0 then
        lfsr <= lfsr(lfsr'left - 1 downto lfsr'right) & feedback(lfsr);  -- Left shift with feedback in
      end if;
    end if;
    if rst_i = '1' then  -- Asynchronous reset
      lfsr <= std_logic_vector(to_unsigned(1, BITS));  -- Reset assigns 1 to lfsr signal
    end if;
  end process;

  prbs_o <= lfsr(BITS);  -- Drive output

end architecture;

「prbs_new」モジュールへのコメント

  • ジェネリック BITS が追加されるため、同じコードから異なる LFSR 長を作成できます。

  • ポートは、入力の場合は「_i」、出力の場合は「_o」で名前が付けられます。これは、この命名規則が、複数のモジュールを持つトップレベルで信号をトレースする場合に非常に役立つためです。

  • ieee.numeric_std非標準パッケージの代わりに、VHDL 標準パッケージが使用されますieee.std_logic_unsigned

  • 信号宣言では、同期リセットと初期値の代わりに非同期リセットが使用されます。

    • 同期リセットよりも優れている点は、非同期リセットは通常、FPGA および ASIC テクノロジのフリップフロップの専用入力に適用され、潜在的にタイミングが重要なデータ パスには適用されないため、設計を高速化できることです。

    • 信号宣言の初期値に対する利点は、FPGA および ASIC テクノロジがこれを実装できる可能性が高いことです。初期値がサポートされていない場合があります。また、機能リセットにより、シミュレータをリロードせずにテストベンチで再起動できます。

  • 適切な最大長のタップが使用され、信号が 0 以外の値にリセットされる場合、 がすべて 0 の値を取得することはないためlfsr、プロセスで信号のすべての 0 の値をチェックすることはありません。lfsrlfsr

于 2013-08-30T15:22:34.477 に答える