見出し画像

1.イネーブル付きのカウンタを作る

一般的にカウンタは、カウンタを任意のタイミングでクリアしたり、カウントアップしたりさせます。ここでは任意のタイミングでカウントアップさせるイネーブル付きのカウンタを作ってみましょう。

回路図(シンボル)で示してみる

以下は回路図(シンボル)になります。
入力reset_nがLレベルの時は、出力q4本(4ビット)は全てLレベルにします。(すなわち0を示す)
リセットされていない(reset_nがH)の間は入力clkの立ち上がりかつ入力enがHレベルでカウントアップし、出力qに出すイネーブル付きカウンタです。

イネーブル付きカウンタの図

動作パターン図で示してみる

以下に示します。入力reset_nがHになってから、入力clkの立ち上がりかつ入力enがHで出力q値(4ビット)がカウントアップします。
なお、4ビットが全てH(16進数でF)の次のクロック立ち上がりで全てL(16進数で0)になります。
さて、これを満たす回路を言語で記載してみるにはどうすればよいでしょうか?

イネーブル付きカウンタの動作パターン図

VHDLで書いてみる

以下のようになります。ただのカウンタと異なるところは、
elsif rising_edge(clk) then
  if en = '1' then 
   counter <= counter + 1;
であり、クロックの立ち上がり時でかつ、入力enがHのときにのみカウンタ値を1つアップするという点です。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity encount is
    Port ( 	clk : in  STD_LOGIC;
           	reset_n : in  STD_LOGIC;
           	en : in STD_LOGIC;
           	q : out  STD_LOGIC_VECTOR (3 downto 0));
end encount;

architecture rtl of encount is
    signal counter : STD_LOGIC_VECTOR (3 downto 0);
begin
    process(clk, reset_n)
    begin
        if reset_n = '0' then
            counter <= (others => '0');
        elsif rising_edge(clk) then
        	if en = '1' then
            	counter <= counter + 1;
        	end if;
        end if;
    end process;
    
    q <= counter;
end rtl;

Verilogで書いてみる

同様にverilogで記載してみます。
else if (en) を追記することで、「enがHだったら」をカウントアップも条件として追加しています。

module encount (
    input wire clk,
    input wire reset_n,
    input wire en,
    output reg [3:0] q
);

reg [3:0] counter;

always @(posedge clk or negedge reset_n) begin
    if (!reset_n)
        counter <= 4'b0000;
    else if (en)
        counter <= counter + 1;
end

assign q = counter;

endmodule

おわりに

「カウンタを作る」「イネーブル付きのカウンタを作る」で、だいぶ言語設計に慣れてきたのではないでしょうか。ありがとうございました。

この記事が気に入ったらサポートをしてみませんか?