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