0

既約多項式を扱っているかどうかを確認するためのカウンターを備えた疑似乱数ジェネレーターに問題があります。ジェネレーターは問題なく動作していますが、サブモジュールとして使用しようとするとカウンターは動作しません。何か案が ??

-- x^6 + x^5 + x^3 + x^2 + 1

Library IEEE;
use ieee.numeric_std.all;

use IEEE.STD_LOGIC_1164.ALL;

use ieee.std_logic_unsigned.all;


entity EPZG is
   port (CLK:       in std_logic;                      
         EQ:        out bit_vector(5 downto 0);  
             A :        out bit );
 end EPZG;

 architecture behaviour of EPZG is 
 component Counter is port ( CLK, RESET : in std_logic;
   result: out bit_vector(5 downto 0)); 
 end component;

signal SZ: bit; 
signal SEQ : bit_vector(5 downto 0); 
signal CNT_RESET : std_logic; 
signal CNT_RESULT : bit_vector(5 downto 0);
begin 
  SZ <= '1';
  PZG : process(CLK)
  begin
  CNT_RESET <= '1';

    if (CLK'event and CLK ='1') then
       SEQ(0) <= SZ xor SEQ(5);
       SEQ(1) <= SEQ(0);
       SEQ(2) <= SEQ(1) xor SEQ(5);
       SEQ(3) <= SEQ(2) xor SEQ(5);
       SEQ(4) <= SEQ(3);
       SEQ(5) <= SEQ(4) xor SEQ(5);
    end if;
end process PZG;
EQ <= SEQ;
CNT: Counter port map ( CLK , RESET =>CNT_RESET,result =>CNT_RESULT);
end behaviour;

カウンターコード

  1. ライブラリIEEE; IEEE.STD_LOGIC_1164.ALLを使用します。ieee.std_logic_unsigned.allを使用します。

    entity Counter is port 
    (CLK, RESET : in std_logic;
      result: out bit_vector(5 downto 0));
    end Counter;
    
    architecture BEHAVIOUR of Counter is
      signal pre_counter: std_logic_vector(5 downto 0);
      begin 
      REG : process(CLK, RESET)
      begin
      if(CLK'event and CLK = '1') then 
         if (RESET = '0') then
             pre_counter <= (others =>'0');
         else
      pre_counter <= pre_counter +1 ;
        end if;
      end if; 
    end process;
    result <= To_bitvector (pre_counter);
    end BEHAVIOUR;
    
4

1 に答える 1

0

では、もう一度試してください。カウンターモジュールがリセットされることpre_counterはないため、初期化されることはありません。これにより、少なくともシミュレーションで未定義の結果が得られます。トップレベルコードでリセットを生成するか、次のように初期化します。

signal pre_counter: std_logic_vector(5 downto 0) := (others => '0');

また、カウンターモジュールのプロセスコードは、いくつかの調整を使用する可能性があります。プロセス感度リストにはclkとの両方が含まれresetていますが、プロセスは同期リセットを使用しています。clkプロセスは、同期リセットを使用して、感度リストでのみ作成する必要があります。

process(clk)
begin
  if(rising_edge(clk)) then
    if(reset = '1') then
    (...)

または非同期リセットを使用し、感度リストに次の両方clkを入力します。reset

process(clk, reset)
begin
  if(reset = '1') then
    (...)
  elsif(rising_edge(clk)) then
    (...)

rising_edge()また、エッジをチェックする「最新の」方法である関数の使用にも注意してください。

于 2012-04-08T09:36:45.450 に答える