用FPGA做正交解碼
FPGA非常適合用邏輯來(lái)實(shí)現(xiàn)正交解碼的功能。
本文引用地址:http://cafeforensic.com/article/202312/454241.htm什么是正交信號(hào)?
正交信號(hào)是兩個(gè)相位差為90度的信號(hào)。它們?cè)跈C(jī)械系統(tǒng)中用于確定軸的運(yùn)動(dòng)(或旋轉(zhuǎn))。
這是一個(gè)向前移動(dòng)幾步的軸。
如果對(duì)脈沖計(jì)數(shù),則可以說(shuō)軸移動(dòng)了3步。
如果計(jì)算邊緣,則可以說(shuō)軸移動(dòng)了12步。這就是我們?cè)诖隧?yè)面上所做的。
現(xiàn)在,軸向后移動(dòng)了相同的量。
因此,想法是通過(guò)查看邊緣和水平,我們可以確定運(yùn)動(dòng)的方向和距離。
這是一個(gè)示例,其中軸向前移動(dòng)10步,然后向后移動(dòng)7步。
它們?cè)谀睦锸褂茫?/h4>如果您打開(kāi)機(jī)械鼠標(biāo),則會(huì)看到以下內(nèi)容。
有兩個(gè)光學(xué)正交編碼器,每個(gè)編碼器由開(kāi)槽輪,光發(fā)射器和一對(duì)光電探測(cè)器制成。
鼠標(biāo)包括負(fù)責(zé)正交解碼和串行/ PS2接口的IC。由于創(chuàng)建正交解碼器(在FPGA中)比串行或PS2接口要容易得多,因此我們修改了鼠標(biāo),并用四緩沖器施密特觸發(fā)器輸入IC替換了原始IC。
我們使用CD4093,每個(gè)NAND門(mén)的輸入連接在一起形成反相器。
現(xiàn)在,鼠標(biāo)輸出正交編碼信號(hào)!
正交解碼器
我們要實(shí)現(xiàn)一個(gè)根據(jù)正交信號(hào)遞增或遞減的計(jì)數(shù)器。我們假設(shè)有一個(gè)比正交信號(hào)快的“過(guò)采樣時(shí)鐘”(在此頁(yè)面中稱(chēng)為“ clk”)。
控制計(jì)數(shù)器的硬件電路非常簡(jiǎn)單。
這是軸向前移動(dòng)的波形,計(jì)數(shù)器會(huì)遞增。
該電路有時(shí)稱(chēng)為“ 4x解碼器”,因?yàn)樗鼤?huì)計(jì)算正交輸入的所有躍遷。
在verilog HDL中,這為我們提供了:
module quad(clk, quadA, quadB, count);
input clk, quadA, quadB;
output [7:0] count;
reg quadA_delayed, quadB_delayed;
always @(posedge clk) quadA_delayed <= quadA;
always @(posedge clk) quadB_delayed <= quadB;
wire count_enable = quadA ^ quadA_delayed ^ quadB ^ quadB_delayed;
wire count_direction = quadA ^ quadB_delayed;
reg [7:0] count;
always @(posedge clk)begin
if(count_enable)
begin
if(count_direction) count<=count+1;
else count<=count-1;
endend endmodule
實(shí)際生活中的電路
先前的電路假定“ quadX”輸入與“ clk”時(shí)鐘同步。在大多數(shù)情況下,“ quadX”信號(hào)與FPGA時(shí)鐘不同步。經(jīng)典解決方案是每個(gè)輸入使用2個(gè)額外的D觸發(fā)器,以避免將亞穩(wěn)性引入計(jì)數(shù)器。
module quad(clk, quadA, quadB, count);
input clk, quadA, quadB;
output [7:0] count;
reg [2:0] quadA_delayed, quadB_delayed;
always @(posedge clk) quadA_delayed <= {quadA_delayed[1:0], quadA};
always @(posedge clk) quadB_delayed <= {quadB_delayed[1:0], quadB};
wire count_enable = quadA_delayed[1] ^ quadA_delayed[2] ^ quadB_delayed[1] ^ quadB_delayed[2];
wire count_direction = quadA_delayed[1] ^ quadB_delayed[2];
reg [7:0] count;
always @(posedge clk)begin
if(count_enable)
begin
if(count_direction) count<=count+1;
else count<=count-1;
endend endmodule
總之,創(chuàng)建正交解碼器/計(jì)數(shù)器所需的硬件很少。FPGA可以容納多個(gè)軸,因此可以同時(shí)跟蹤多個(gè)軸。
如果您打開(kāi)機(jī)械鼠標(biāo),則會(huì)看到以下內(nèi)容。
有兩個(gè)光學(xué)正交編碼器,每個(gè)編碼器由開(kāi)槽輪,光發(fā)射器和一對(duì)光電探測(cè)器制成。
鼠標(biāo)包括負(fù)責(zé)正交解碼和串行/ PS2接口的IC。由于創(chuàng)建正交解碼器(在FPGA中)比串行或PS2接口要容易得多,因此我們修改了鼠標(biāo),并用四緩沖器施密特觸發(fā)器輸入IC替換了原始IC。
我們使用CD4093,每個(gè)NAND門(mén)的輸入連接在一起形成反相器。
現(xiàn)在,鼠標(biāo)輸出正交編碼信號(hào)!
我們要實(shí)現(xiàn)一個(gè)根據(jù)正交信號(hào)遞增或遞減的計(jì)數(shù)器。我們假設(shè)有一個(gè)比正交信號(hào)快的“過(guò)采樣時(shí)鐘”(在此頁(yè)面中稱(chēng)為“ clk”)。
控制計(jì)數(shù)器的硬件電路非常簡(jiǎn)單。
這是軸向前移動(dòng)的波形,計(jì)數(shù)器會(huì)遞增。
該電路有時(shí)稱(chēng)為“ 4x解碼器”,因?yàn)樗鼤?huì)計(jì)算正交輸入的所有躍遷。
在verilog HDL中,這為我們提供了:
module quad(clk, quadA, quadB, count); input clk, quadA, quadB; output [7:0] count; reg quadA_delayed, quadB_delayed; always @(posedge clk) quadA_delayed <= quadA; always @(posedge clk) quadB_delayed <= quadB; wire count_enable = quadA ^ quadA_delayed ^ quadB ^ quadB_delayed; wire count_direction = quadA ^ quadB_delayed; reg [7:0] count; always @(posedge clk)begin if(count_enable) begin if(count_direction) count<=count+1; else count<=count-1; endend endmodule
先前的電路假定“ quadX”輸入與“ clk”時(shí)鐘同步。在大多數(shù)情況下,“ quadX”信號(hào)與FPGA時(shí)鐘不同步。經(jīng)典解決方案是每個(gè)輸入使用2個(gè)額外的D觸發(fā)器,以避免將亞穩(wěn)性引入計(jì)數(shù)器。
module quad(clk, quadA, quadB, count); input clk, quadA, quadB; output [7:0] count; reg [2:0] quadA_delayed, quadB_delayed; always @(posedge clk) quadA_delayed <= {quadA_delayed[1:0], quadA}; always @(posedge clk) quadB_delayed <= {quadB_delayed[1:0], quadB}; wire count_enable = quadA_delayed[1] ^ quadA_delayed[2] ^ quadB_delayed[1] ^ quadB_delayed[2]; wire count_direction = quadA_delayed[1] ^ quadB_delayed[2]; reg [7:0] count; always @(posedge clk)begin if(count_enable) begin if(count_direction) count<=count+1; else count<=count-1; endend endmodule
總之,創(chuàng)建正交解碼器/計(jì)數(shù)器所需的硬件很少。FPGA可以容納多個(gè)軸,因此可以同時(shí)跟蹤多個(gè)軸。
評(píng)論