見出し画像

3.ロード・イネーブル付きのカウンタを作る

ここでは、ロードとイネーブル付きのカウンタを作ることにします。任意のタイミングでカウントアップしたり、任意のタイミングで任意の数値からカウントアップさせるロード付きのカウンタを作ってみましょう。

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

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

ロード・イネーブルt付きのカウンタの図

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

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

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

VHDLで書いてみる

以下のようになります。ただのカウンタと異なるところは、
elsif rising_edge(clk) then 
    if ld = '1' then
  counter <= ld_data;
 elsif en = '1' then
  counter <= counter + '1';

であり、上部の記述されているldがenより優先される回路となっています。

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

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

architecture rtl of enldcount 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 ld = '1' then
            		counter <= ld_data;
        	elsif en = '1' then
        		counter <= counter + '1';
        	end if;
        end if;
    end process;
    
    q <= counter;
end rtl;

Verilogで書いてみる

同様にverilogで記載してみます。

module enldcount (
    input wire clk,
    input wire reset_n,
    input wire en,
    input wire ld,
    input wire [3:0] ld_data,
    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 (ld)
        counter <= ld_data;
    else if (en)
        counter <= counter + 4'b0001;
end

assign q = counter;

endmodule

おわりに

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

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