見出し画像

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

おわりに

だいぶ言語設計に慣れてきたのではないでしょうか。ありがとうございました。

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