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