1

私たちはグループで大学のプロジェクト用にロボットを設計しています。私たちは電気工学の 1 年生です。ロボットは、単純な LC オシレータとコンパレータで地雷を検出する必要があります。この回路の出力はブロック波であるため、FPGA は指定された数までカウントし、事前に定義された数と比較して、発振器の周波数に変化があるかどうかを確認できます (金属オブジェクトがあることを意味します)。センサーの下)。私はこれを書きましたが、両方のカウンターが実質的に同じであるため、rising_edge(センサー) が機能しないように見えます。クロックのエンティティはまったく同じですが、クロックを入力として使用します。

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
use IEEE.numeric_std.all;

entity metaal_detector is
  port(
    sensor, reset: in std_logic;
    sensor_out: out std_logic_vector(10 downto 0)
 );
 end entity metaal_detector;

 architecture behavioural of metaal_detector is
signal  count, new_count    : unsigned (10 downto 0);

begin
process (sensor)
begin
    if (rising_edge (sensor)) then
        if (reset = '1') then
            count   <= (others => '0'); -- zet op 0 bij reset
        else
            count   <= new_count;
        end if;
    end if;
end process;

process (count)
begin
    new_count   <= count + 1;   
end process;

sensor_out  <= std_logic_vector (count);
end architecture behavioural;

これは私のテストベンチです:

 library IEEE;
 use IEEE.std_logic_1164.all;

 entity testbench is
 end entity testbench;

 architecture test of testbench is

  component sensor_control is
    port(
    clk, reset, sensor: in std_logic;
   metaal: out std_logic;
   reset_teller: out std_logic
   );
 end component;

  component counter is
   port(
   clk, reset: in std_logic;
   count_out: out std_logic_vector(10 downto 0)
   );
 end component;

 component metaal_detector is
  port(
 sensor, reset: in std_logic;
 sensor_out: out std_logic_vector(10 downto 0)
 );
 end component;

  signal sensor, clock, reset, metaal, reset_teller: std_logic; 
   signal count1, sensor1: std_logic_vector(10 downto 0);

   begin

  clock <=       '1' after  0 ns,
             '0' after 10 ns when clock /= '0' else '1' after 10 ns;
    reset   <=       '1' after 0 ns,
                     '0' after 35 ns;
    sensor   <=  '1' after  0 ns,
             '0' after 30 ns when sensor /= '0' else '1' after 30 ns;


 lblb0: sensor_control port map (clock, reset, sensor, metaal, reset_teller);                       
 lbl0: counter port map(clock, reset_teller, count1);
 lbl1: metaal_detector port map(sensor, reset_teller, sensor1);
 end architecture test;

どこかでクロックの代わりにclkを使用するのは、非常に多くのことを試しているためです。

説明していただければ幸いです。私は何か間違ったことをしています。

デビッド・ケスター

4

1 に答える 1

0

「count」から「new_count」を分離する必要はありません...それらを1つのプロセスに結合するだけです!カウンター (同期リセット付き) は通常、次のように実装されます。

process (clock) 
begin
   if rising_edge(clock) then
      if reset='1' then 
         count <= (others => '0');
      else      -- or, with clock enable:  elsif clock_enable='1' then
         count <= count + 1;
      end if;
   end if;
end process; 
于 2013-05-21T06:12:28.437 に答える