6.カウンタと比較器を作る~その2
ここでは、2つのカウンタとそのカウント値を比較して大きい方のカウント値を出力をする比較器を作ってみましょう。
回路図(シンボル)で示してみる
イネーブル付きのカウンタを2個用意し、それぞれのカウント値を後段の比較器で比較し、大きい方のカウント値をbigcntとして出力しています。
動作パターン図で示してみる
下図の通り、比較器では2つのカウンタの結果(counter1,counter2)を比較し、大きい方の値を即時に出力しています。
VHDLで書いてみる
後段の process(counter1,counter2) で即時比較をして、大きい方の値を出力する記述を行っています。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity biggercmp is
Port ( clk : in STD_LOGIC;
reset_n : in STD_LOGIC;
en1 : in STD_LOGIC;
en2 : in STD_LOGIC;
bigcnt : out STD_LOGIC_VECTOR (3 downto 0));
end biggercmp;
architecture rtl of biggercmp is
signal counter1 : STD_LOGIC_VECTOR (3 downto 0);
signal counter2 : STD_LOGIC_VECTOR (3 downto 0);
begin
process(clk, reset_n)
begin
if reset_n = '0' then
counter1 <= (others => '0');
elsif rising_edge(clk) then
if en1 = '1' then
counter1 <= counter1 + 1;
end if;
end if;
end process;
process(clk, reset_n)
begin
if reset_n = '0' then
counter2 <= (others => '0');
elsif rising_edge(clk) then
if en2 = '1' then
counter2 <= counter2 + 1;
end if;
end if;
end process;
process(counter1,counter2)
begin
if counter1 >= counter2 then
bigcnt <= counter1;
else
bigcnt <= counter2;
end if;
end process;
end rtl;
Verilogで書いてみる
同様に後段の always @(*) begin で即時比較をして、大きい方の値を出力する記述を行っています。
module biggercmp (
input wire clk,
input wire reset_n,
input wire en1,
input wire en2,
output reg [3:0] bigcnt
);
reg [3:0] counter1;
reg [3:0] counter2;
always @(posedge clk or negedge reset_n) begin
if (!reset_n)
counter1 <= 4'b0000;
else if (en1)
counter1 <= counter1 + 4'b0001;
end
always @(posedge clk or negedge reset_n) begin
if (!reset_n)
counter2 <= 4'b0000;
else if (en2)
counter2 <= counter2 + 4'b0001;
end
always @(*) begin
if (counter1 >= counter2)
bigcnt <= counter1;
else
bigcnt <= counter2;
end
endmodule
おわりに
だいぶ言語設計に慣れてきたのではないでしょうか。ありがとうございました。
この記事が気に入ったらサポートをしてみませんか?