ロータリーエンコーダ処理
ロータリーエンコーダを入手したので、デコード処理を記述します。
処理としては、
1) チャタリング吸収
1) チャタリング吸収
(これは以前作成したsw_debounce.vをそのまま使用します)
2) エンコード処理
2) エンコード処理
A入力、B入力からプラス方向、マイナス方向を検出します。
簡単に処理するために、A入力の立ち下がりエッジを検出して、その時のB入力で
プラス方向、マイナス方向の検出を行います。
クロック出力はA入力の立ち上がりエッジを使用します。
FPGAでは両エッジ検出フリップフロップが使用できないために、クロックは外側の
ロジックにて処理します。
回路は次のようになりました。
3) encode検出verilog
3) encode検出verilog
rotenc_2.v
module rotenc_2(enc_a, enc_b, pm);
input enc_a;
input enc_b;
output pm;
reg pm;
always @(negedge enc_a)
begin
if (!enc_b)
pm = 1;
else
pm = 0;
end
endmodule
4) up/down counter verilog
up/down counter verilog
module counter_updn_3(clk, updn, count);
input clk;
input updn; // up=1, down=0
output [7:0] count;
reg [7:0] count;
always @(posedge clk)
begin
if (updn)
count = count + 1;
else
count = count - 1;
end
endmodule