前提・実現したいこと
Verilog HDLにて、参考書のチャタリング処理を理解すること。
理解できない問題
下記、ソースの処理が理解できない。
ご教授いただければ助かります。
module debounce ( input CLK, input RST, input BTNIN, output reg BTNOUT ); /* 125MHzを分周し40Hzを作成 */ reg [21:0] cnt22; wire en40hz = (cnt22==22'd3125000-1); always @( posedge CLK ) begin if ( RST ) cnt22 <= 22'h0; else if ( en40hz ) cnt22 <= 22'h0; else cnt22 <= cnt22 + 22'h1; end /* スイッチ入力をFF2個で受ける */ reg ff1, ff2; always @( posedge CLK ) begin if ( RST ) begin ff1 <= 1'b0; ff2 <= 1'b0; end else if ( en40hz ) begin ff2 <= ff1; ff1 <= BTNIN; end end /* 立ち上がり検出し、FFで受ける */ wire temp = ff1 & ~ff2 & en40hz; always @( posedge CLK ) begin if ( RST ) BTNOUT <= 1'b0; else BTNOUT <= temp; end endmodule
該当のソースコード
私の理解は、スイッチ入力をFF2個で受けとり
スイッチの値が前値が0で、現在の値が1であるから立ち上がった値である。
そして、40Hzの間隔でCLK1上がった時のタイミングである。
それのタイミングをANDしている。とソースから推測しました。
40Hz間隔のCLK1周期で、1回分の値でスイッチが押された?ってなんでそれが正しい値なのかが
自分にはわからないです。たとえばノイズだったりとかでも誤動作しないのか?
など考えてしまい。この処理で良いのかがわからないです。
/* スイッチ入力をFF2個で受ける */ reg ff1, ff2; always @( posedge CLK ) begin if ( RST ) begin ff1 <= 1'b0; ff2 <= 1'b0; end else if ( en40hz ) begin ff2 <= ff1; ff1 <= BTNIN; end end /* 立ち上がり検出し、FFで受ける */ wire temp = ff1 & ~ff2 & en40hz;
マイコンでのチャタリング処理
void *func_thread(void* args) { static int last=0; //前回のスイッチの確定値 static int sw1=0; //今回のスイッチの読取り値 static int sw2=0; //前回のスイッチの読取り値 static int sw3=0; //前々回のスイッチの読取り値 static int cnt=0; //スイッチ読取りのタイミング調製用カウンタ printf("thread start\n"); while(1){ if(kill == 1) break; if(cnt==9){ //10ms間隔で読み取る cnt = 0; sw3 = sw2; //前々回のスイッチの読取り値を保存する sw2 = sw1; //前回のスイッチの読取り値を保存する sw1 = get_sw(); //今回のスイッチの読取り値を保存する if((sw3==sw2) && (sw2==sw1)) now = sw1; //今回と前回と前々回のスイッチの読取り値が //等しければ、それを現在のスイッチの確定値とする if(now!=last){ if(now & ~last){ //前回と今回(現在)のスイッチの確定値が異なる場合 up |= switch_on; //立上がり(スイッチの押下)検出 if(up & 0x1){ rew = now; } } last = now; //今回のスイッチの確定値を(最後の値として)保存する } }else{ cnt++; } } return 0; }
三回スイッチの値を取得して、一致したら、立ち上がり処理をしています。
VerilogHDLでは、値を三回取得してから、立ち上がり処理などしなくていいのかが分からないです。
ハザード処理について
always @( posedge CLK ) begin if ( RST ) BTNOUT <= 1'b0; else BTNOUT <= temp; end
これで回避できる理由が理解できなくて、説明が欲しいです。
どうしても納得ができなくて、先に進めなく、ご教授いただけると助かります。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/11 01:56
2019/12/11 02:12 編集