FPGA旋轉編碼器的實現

2021-09-08 08:13:27 字數 3680 閱讀 9497

module pmodenc(

clk,

rst_n,

a,b,

btn,

// a_debounce,

// b_debounce,

// btn_debounce,

// rotary_right,

// rotary_left

led);

input wire clk,rst_n;

input wire a,b,btn;

// output wire a_debounce,b_debounce,btn_debounce;

// output wire rotary_right,rotary_left;

output wire [5:0]led;

reg clk_10ms;

reg [31:0]count;

reg a_reg,a_reg0;

reg b_reg,b_reg0;

reg btn_reg,btn_reg0;

wire a_debounce;

wire b_debounce;

wire btn_debounce;

reg a_debounce_reg;

reg b_debounce_reg;

wire a_pos,a_neg;

wire b_pos,b_neg;

reg rotary_right;

reg rotary_left;

reg rotary_right_reg,rotary_left_reg;

wire rotary_right_pos,rotary_left_pos;

wire rotary_event;

reg [5:0]shift_d;

always@(posedge clk,negedge rst_n)begin

if(!rst_n)begin

count <= 0;

clk_10ms <= 1'b0;

endelse begin

if(count < 32'd24_999)begin//10ms消抖,25mclk

count <= count + 1'b1;

clk_10ms <= 1'b0;

endelse begin

count <= 0;

clk_10ms <= 1'b1;

endend

endalways@(posedge clk,negedge rst_n)begin

if(!rst_n)begin

a_reg <= 1'b1;

a_reg0 <= 1'b1;

b_reg <= 1'b1;

b_reg0 <= 1'b1;

btn_reg <= 1'b0;

btn_reg0 <= 1'b0;

endelse begin

if(clk_10ms)begin

a_reg <= a;

a_reg0 <= a_reg;

b_reg <= b;

b_reg0 <= b_reg;

btn_reg <= btn;

btn_reg0 <= btn_reg;

endend

endassign a_debounce = a_reg0 && a_reg && a;

assign b_debounce = b_reg0 && b_reg && b;

assign btn_debounce = btn_reg0 && btn_reg && btn;//消抖後製作脈衝上公升沿

always@(posedge clk,negedge rst_n)begin

if(!rst_n)begin

a_debounce_reg <= 1'b1;

// b_debounce_reg <= 1'b1;

endelse begin

a_debounce_reg <= a_debounce;

// b_debounce_reg <= b_debounce;

endend

assign a_pos = !a_debounce_reg && a_debounce;

// assign b_pos = !b_debounce_reg && b_debounce;

assign a_neg = a_debounce_reg && !a_debounce;

// assign b_neg = b_debounce_reg && !b_debounce;

always@(posedge clk,negedge rst_n)begin

if(!rst_n)begin

rotary_right <= 1'b1;

rotary_left <= 1'b1;

endelse begin

if(a_pos && !b_debounce)begin//a的上公升沿時候如果b為低電平,則旋轉編碼器是向右轉

rotary_right <= 1'b1;

endif(a_pos && b_debounce)begin//a上公升沿時候如果b為低電平,則旋轉編碼器是向左轉

rotary_left <= 1'b1;

endif(a_neg && b_debounce)begin//a的下降沿b為高電平,則向右轉結束

rotary_right <= 1'b0;

endif(a_neg && !b_debounce)begin//a的下降沿b為低電平,則向左轉結束

rotary_left <= 1'b0;

endend

end// assign rotary_left = rotary_left;

// assign rotary_right = rotary_right;

always@(posedge clk,negedge rst_n)begin

if(!rst_n)begin

rotary_right_reg <= 1'b1;

rotary_left_reg <= 1'b1;

endelse begin

rotary_right_reg <= rotary_right;

rotary_left_reg <= rotary_left;

endend

assign rotary_right_pos = !rotary_right_reg && rotary_right;

assign rotary_left_pos = !rotary_left_reg && rotary_left;//消抖

assign rotary_event = rotary_right_pos || rotary_left_pos;//轉動標誌位

always@(posedge clk,negedge rst_n)begin

if(!rst_n)

shift_d <= 6'b111_110;

else if(rotary_event)begin

if(rotary_right_pos)

shift_d <= ;

if(rotary_left_pos)

shift_d <= ;

endend

assign led = shift_d;//燈的向左向右的測試模組

endmodule

原理的話可以參考下這位大神講的

posted on 2016-07-18 23:34收藏

旋轉編碼器

旋轉編碼器用來測位置角度速度位移等資訊。分類 按原理 光電式和磁電效應式 旋轉的永磁體和不動的監測裝置 按訊號 增量式 脈衝式 和絕對式 碼盤刻有絕對值圖譜,分為二進位制和格雷碼或格雷碼的餘碼輸出 初始位置不為0,非2的冪次方 安裝方式 軸型 加裝固定,安裝成本高 和軸套型 安裝空間小成本低 單圈 ...

連線編碼器 旋轉編碼器的接線方式

旋轉編碼器是一種光電式旋轉丈量裝置,它將被測的角位移直接改換成數碼訊號 高速脈衝訊號 因而可將旋轉編碼器的輸出脈衝訊號直接輸入給plc,運用plc的高速計數器對其脈衝訊號進行計數,歐姆龍觸控螢幕,以取得丈量成果。紛歧樣型別的旋轉編碼器,其輸出脈衝的相數也紛歧樣,有的旋轉編碼器輸出a b z三相脈衝,...

11旋轉編碼器原理 旋轉編碼器的工作原理和分類

旋轉編碼器是集光機電技術於一體的速度位移感測器。當旋轉編碼器軸帶動光柵盤旋轉時,經發光元件發出的光被光柵盤狹縫切割成斷續光線,並被接收元件接收產生初始訊號。該訊號經後繼電路處理後,輸出脈衝或 訊號。它的特點是體積小,功能全,頻響高,分辨能力高,重量輕,品種多,力矩小,耗能低,效能穩定,可靠使用壽命長...