3.ロード・イネーブル付きのカウンタを作る
ここでは、ロードとイネーブル付きのカウンタを作ることにします。任意のタイミングでカウントアップしたり、任意のタイミングで任意の数値からカウントアップさせるロード付きのカウンタを作ってみましょう。
回路図(シンボル)で示してみる
以下は回路図(シンボル)になります。
入力reset_nがLレベルの時は、出力q4本(4ビット)は全てLレベルにします。(すなわち0を示す)
リセットされていない(reset_nがH)の間は入力clkの立ち上がりかつ入力ldがHレベルで入力lddata(4ビット)の値を読み込みます。
入力ldがL、かつ入力enがHの時はカウントアップし出力qに出すロード・イネーブル付きカウンタです。
動作パターン図で示してみる
以下に示します。入力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
おわりに
「カウンタを作る」「イネーブル付きのカウンタを作る」「ロード付きのカウンタを作る」に加え「ロード・イネーブル付きのカウンタを作る」で、だいぶ言語設計に慣れてきたのではないでしょうか。ありがとうございました。
この記事が気に入ったらサポートをしてみませんか?