1

Nexys2 ボード用の RS232 モジュールを作成しています。現在、19200 に設定したいボー レート コントローラに問題があります。

このために、私は Mod-M カウンターを使用しています。多くの ISim シミュレーションの後、私のコードの問題は mod-m カウンターにあり、ティックが生成されません。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
use IEEE.NUMERIC_STD.ALL;

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

entity baud_rate is
    generic (
    N: integer := 8;
    M: integer :=163);
    Port (clk, reset : in  STD_LOGIC;
           tick : out  STD_LOGIC;
              q : out STD_LOGIC_VECTOR(N-1 downto 0));

end baud_rate;

architecture Behavioral of baud_rate is
signal r_reg :  unsigned(N-1 downto 0);
signal r_next : unsigned(N-1 downto 0);
begin
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;

r_next <= (others =>'0') when r_reg=(M-1) else r_reg+1;
tick <='1' when r_reg=(M-1) else '0';
q <= std_logic_vector(r_reg);


end Behavioral;

すべての clk 入力をテストし、正常に実行しましたが、問題は r_reg および r_next レジスタにあるようです。ISim でこれらのいずれかを q に出力すると、UUUUUUUU が表示されるため、信号が生成されていないようです。このことから、r_reg と r_next の 2 つのレジスタが作成されていない、または値が格納されていないと推測できます。符号なしを使用する場合に問題はありますか?

念のため、書籍『FPGA Prototyping with VHDL』(表示されているコード) から mod-m カウンターをコピーしましたが、それでも機能せず、q 出力は UUUUUUUU です。

nexys2 50mzクロックからボーレートを作成するより良い方法があれば、それも歓迎します!

乾杯

4

1 に答える 1

3

率直に言って、このような例が紹介されている本からVHDLを学ぶことが期待されているとしたら、私は恐ろしいです。著者がVerilogについて同様の本を持っていることを私は知っています:人々はVHDLがより冗長なVerilogであると思ってしまうのでしょうか?

特定の批判(実際には7,8はより多くの観察です):

1)スプリアス型変換。Qは符号なしの数値を表します。だからそれを署名なしにしてください!

FPGAに搭載されているのはボージェネレータだけではないため、Qがオフチップポートになる可能性は低くなります。トップレベルのオフチップポートをstd_logic_vectorにすることには良い議論がありますが、それでも必須ではありません。ただし、顧客の仕様またはコーディングスタイルが、ポートでの偽の型変換を要求している場合。それに従います。

2)DRYの原則:

package CPU_types is
    subtype baud_count is unsigned(7 downto 0);
end CPU_types;

メンテナンスの簡素化を見つけてください。
複数の場所でサブタイプを使用している場合は、それをパッケージに入れてください。ユニバーサルコード再利用ツール。

3)インデント、フォーマット。(エディターの設定によって文字化けしている可能性があることを認識しています)。それはそれを読む脳の負荷に追加されます。私がここでやったことは、一方通行ではありません。

4)スプリアスブラケットは論理式を囲みます。無害ですが、Cプログラマーにとっては松葉杖のように見えます。

5)アンティークclk'イベントスタイル。来年、rising_edge関数は飲むのに十分な年齢になります(アメリカでは。イギリスでは、ここ数年、毎週土曜日の夜に漆喰が塗られています...)

6)r_regとr_nextを使用した「2プロセス」スタイル。彼はまた、next_stateで個別の組み合わせプロセスを使用してステートマシンを作成しますか?これを考えると、私はそう推測しています。シングルプロセスステートマシンは、より簡単で、より小さく(記述:より小さなハードウェアを生成しません)、より安全です。

7)だまされて、ダニが元のダニより1サイクル遅れています。それが重要な場合は、外部の「ティック」割り当てを復元します。また、同期vhichがパフォーマンスに役立つようにしました。tick <= '0'一部の人々はelse節を好むでしょう。ただし、私が使用したデフォルトの割り当ては安全であり、大規模な設計での多くの間違い(および不要なelse句)を防ぎます。

8)Qへの割り当てもプロセスに取り入れることができます。r_regをプロセス変数にした場合は、そうする必要があります。他のバリエーションや好みの余地があります。

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

    entity baud_rate is
        generic (
            M: integer := 163);
        Port (
            clk, reset : in  STD_LOGIC;
            tick : out  STD_LOGIC;
            q    : out baud_count);  
    end baud_rate;

    architecture Behavioral of baud_rate is
        signal r_reg : baud_count;
    begin

    process(clk,reset)
    begin
        if reset ='1' then
            r_reg <= (others=>'0');
        elsif rising_edge(clk) then 
            tick  <= 0;
            r_reg <= r_reg+1;
            if r_reg = M then 
                tick  <= '1';
                r_reg <= (others=>'0');
            end if;
        end if;
    end process;

--    tick <='1' when r_reg = M-1 else '0';
--    or simpler, when r_reg = 0
    q <= r_reg;

    end Behavioral;
于 2013-01-11T12:16:04.460 に答える