0

mod-m カウンターによって駆動される 2 つのパルス発生器で構成されるパルス発生器を構築しようとしています。カウンターは設定された時間でサイクルをループし、指定された時間に到達すると、パルスジェネレーターはその時間に短い方形波パルスを生成します。

これはシミュレーションでは機能しますが、これを FPGA ボードに実装すると、方形波パルスの 1 サイクルは正常に実行されますが、カウンターが永久に 0 に固定されているかのようにスタックします(出力myag_qbyag_qは0 に固定されbyag_lmyag_l1) で立ち往生しています。カウンター自体をシミュレートしたところ、0 と M の間でループし続けていることがわかりました。

最上位モジュール、mod-m カウンター、およびパルス ジェネレーターのコードを以下に示します。他のパルス発生器は、最初のものと非常によく似ています。ピンの割り当てが正しいと確信しているので、ユーザー制約ファイルをチェックする必要はありません。これらのモジュールを組み合わせる際に大きな間違いを犯したかどうか/最後のプログラム (パルスジェネレータ) が正しく書かれているかどうかについての一般的な考えが必要です。最も重要なことは、カウンターを使用してパルスをトリガーする方法が正しいかどうかを知る必要があることです。

最上位モジュール

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity trigger is
    Port ( clk, rst : in  STD_LOGIC;
              d: in STD_LOGIC_VECTOR(25 downto 0);
           myag_l, myag_q, byag_l, byag_q : out  STD_LOGIC);
end trigger;

architecture struc_arch of trigger is
signal counter: STD_LOGIC_VECTOR (25 downto 0);
begin

mini_yag: entity work.mini_yag(Behavioral)
port map(clk=>clk,rst=>rst,count=>counter,myag_l=>myag_l,myag_q=>myag_q);
big_yag: entity work.big_yag(Behavioral)
port map(clk=>clk,rst=>rst,d=>d,count=>counter,byag_l=>byag_l,byag_q=>byag_q);
baud: entity work.mod_m_counter(arch)
generic map(N=>26,M=>6434344)
port map(clk=>clk,reset=>rst,max_tick=>open,q=>counter);

end struc_arch;

Mod-Mカウンター

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity mod_m_counter is
     generic (
        N: integer := 4; -- number of bits
        M: integer := 10 -- mod-M
     );
    Port ( clk, reset : in  STD_LOGIC;
           max_tick : out  STD_LOGIC;
           q : out  STD_LOGIC_VECTOR (N-1 downto 0));
end mod_m_counter;

architecture arch of mod_m_counter is
    signal r_reg: unsigned (N-1 downto 0);
    signal r_next: unsigned (N-1 downto 0);
begin
    --register
    process(clk,reset)
    begin
        if (reset='1') then
            r_reg <= (others=>'0');
        elsif (clk'event and clk='1') then
            r_reg <= r_next;
        end if;
    end process;
    --next-state logic
    r_next <= (others=>'0') when r_reg=(M-1) else
                 r_reg + 1;
    --output logic
    q <= std_logic_vector(r_reg);
    max_tick <= '1' when r_reg=(M-1) else '0';
end arch;

パルス発生器

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity big_yag is
generic(
T1: unsigned :=to_unsigned(0,26); --Lamp On
T2: unsigned :=to_unsigned(138889,26); --Lamp Off
T3: unsigned :=to_unsigned(4305555,26); --Q-switch On
T4: unsigned :=to_unsigned(4343434,26); --Q-switch Off
T5: unsigned :=to_unsigned(6434343,26)  --Reset Sequence
);
Port( 
clk,rst : in STD_LOGIC;
d,count: in STD_LOGIC_VECTOR(25 downto 0);
byag_l,byag_q : out STD_LOGIC
);
end big_yag;

architecture Behavioral of big_yag is
signal delay,counter: unsigned (25 downto 0);
signal byag_l_reg,byag_l_next,byag_q_reg,byag_q_next: std_logic;
begin
delay <= unsigned(d);
counter <= unsigned(count);

--register
process(rst,clk)
begin
if rst='1' then
    byag_l_reg <= '0';
    byag_q_reg <= '0';
elsif (clk='1' and clk'event) then
    byag_l_reg <= byag_l_next;
    byag_q_reg <= byag_q_next;
end if;
end process;

--next state logic
byag_l_next <= '1' when counter = T1+delay else
               '0' when counter = T2+delay else
               byag_l_reg;
byag_q_next <= '0' when counter = T1+delay else
               '1' when counter = T3+delay else
               '0' when counter = T4+delay else
               byag_q_reg;

--output logic
byag_l <= byag_l_reg;
byag_q <= byag_q_reg;

end Behavioral;
4

1 に答える 1