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
おわりに
「カウンタを作る」「イネーブル付きのカウンタを作る」で、だいぶ言語設計に慣れてきたのではないでしょうか。ありがとうございました。
この記事が気に入ったらサポートをしてみませんか?