chy520cvv 发表于 2015-11-19 12:38:50

【小脚丫Step FPGA】***式编码开关----微风细雨

       全阶段优化设计,英特尔Quartus Prime成就强大FPGA

虽然之前的***编码开关没能秒杀到,但是还是想做一下这个模块驱动
       小型***编码器,又称***编码开关,是指具有一组有规律且严格时 序脉冲的开关电子元器件。通过与IC的配合,起到递增,递减,翻页等功能,例:鼠标的翻页,菜单的选择,音响的声音与调节,频率的调节,多仕炉的温度调节,医用器械的频率调节等。
       按结构可将其分为机械式***编码开关和光电式***编码开关。所谓机械式***编码开关,是指通过信号配合零件的规律转动或(移动)形成触点接触而产生规律脉冲的编码产品,其寿命具有较大的局限性;光电式***编码开关,是指通过光源耦合,形成的无接触点接触而产生规律脉冲的编码产品,其寿命极长。
       本节实验采用的是Pmod模块,先介绍一下开关结构。
       ***编码结构:

      由于是机械结构,所以开关输出波形存在抖动。开关向右***时,A,B输出波形如下。可见A相波形先由低变高,或者说A相超前B相。

       当开关向左***时,波形类似,区别在于B输出波形,先由低变高,或者说A相滞后于B相。
       这样理解可能有点晦涩,那可以简单描述为,在A相的上升沿,若B相为低电平,则开关向右***。同理,在A相的上升沿,若B相为高电平,则开关向左***。
      
      ***编码原理理解后,再看看开关自带的按键。只是一个按键下拉输出而已,结构如下:


       理解其原理之后,代码方面就简单许多。关键代码如下: always@(posedge clk,posedge rst)begin
                if(rst)begin
                        A_Debounce_reg <= 1'b1;
                end
                else begin
                        A_Debounce_reg <= A_Debounce;
                end
      end
      
      assign A_pos = !A_Debounce_reg && A_Debounce;
      assign A_neg = A_Debounce_reg && !A_Debounce;
      
      always@(posedge clk,posedge rst)begin
                if(rst)begin
                        rotary_right <= 1'b1;
                        rotary_left <= 1'b1;
                end
                else begin
                        if(A_pos && !B_Debounce)begin
                              rotary_right <= 1'b1;
                        end
                        
                        if(A_pos && B_Debounce)begin
                              rotary_left <= 1'b1;
                        end
                        
                        if(A_neg && B_Debounce)begin
                              rotary_right <= 1'b0;
                        end
                        
                        if(A_neg && !B_Debounce)begin
                              rotary_left <= 1'b0;
                        end
                end
      end

      always@(posedge clk,posedge rst)begin
                if(rst)begin
                        rotary_right_reg <= 1'b1;
                        rotary_left_reg <= 1'b1;
                end
                else begin
                        rotary_right_reg <= rotary_right;
                        rotary_left_reg <= rotary_left;
                end
      end

      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;代码解释:
A,B两相经过消抖,得到稳定的A_Debounce和B_Debounce。***的判断都是基于这两个消抖后的信号。根据之前的原理分析,在A相上升沿,B相为低电平时,将右转信号赋值为高电平。在A相下升沿,B相为高电平时,将右转信号赋值为低电平。同理处理左转信号。
在得到左转和右转信号后,可以通过两者的上升沿进行***事件判断。通过rotary_event来决定是否进行其他操作,如LED是否移动,在通过判断左右转信号的上升沿来判断左转或者右转。

源代码附在下来,如有需要回复可见。相信想学习FPGA的都能完成该项目!!!

**** Hidden Message *****





菜鸟-374691 发表于 2024-6-5 09:59:47

谢谢分享!

eefocus_3842425 发表于 2024-3-27 14:27:03

学习学习

eefocus_3961189 发表于 2024-3-14 20:30:03

感谢分享

eefocus_3959330 发表于 2024-3-4 17:18:33

学习学习

eefocus_3950928 发表于 2023-12-13 11:09:57

学习学习

曾_33c9a9 发表于 2023-10-13 16:26:07

谢谢

eefocus_3840979 发表于 2023-5-24 22:34:54

学习学习!

eefocus_3906913 发表于 2023-3-17 15:29:21

看看,学习!

eefocus_3906913 发表于 2023-3-17 15:28:02

看看,学习!
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 【小脚丫Step FPGA】***式编码开关----微风细雨

Baidu
map