見出し画像

2.ロード付きのカウンタを作る

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

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

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

ロード付きカウンタの図

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

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

ロード付きカウンタの動作パターン図

VHDLで書いてみる

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

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

entity ldcount is
    Port ( 	clk : in  STD_LOGIC;
           	reset_n : 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 ldcount;

architecture rtl of ldcount 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;
        	else
        		counter <= counter + '1';
        	end if;
        end if;
    end process;
    
    q <= counter;
end rtl;

Verilogで書いてみる

同様にverilogで記載してみます。
else if (ld) を追記することで、「ldがHだったら」をlld_dataの値を読み込む(カウンタ値とする)回路を作成しています。

module ldcount (
    input wire clk,
    input wire reset_n,
    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
        counter <= counter + 4'b0001;
end

assign q = counter;

endmodule

おわりに

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

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