差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 | 上一修订版 两侧同时换到之后的修订记录 | ||
旋转调节系统设计 [2018/10/22 13:56] anran [实验原理] |
旋转调节系统设计 [2018/10/22 13:59] anran [实验原理] |
||
---|---|---|---|
行 51: | 行 51: | ||
* 逆时针旋转时,B触点超前于A触点接触和错开圆形齿轮,B信号脉冲相位超前 | * 逆时针旋转时,B触点超前于A触点接触和错开圆形齿轮,B信号脉冲相位超前 | ||
- | {{:4-编码器顺时针旋转时序.jpg?600|编码器顺时针旋转时序}} | + | {{:4-编码器顺时针旋转时序.png?600|编码器顺时针旋转时序}} |
- | {{:4-编码器逆时针旋转时序.jpg?600|编码器逆时针旋转时序}} | + | {{:4-编码器逆时针旋转时序.png?600|编码器逆时针旋转时序}} |
根据时序图可以看出旋转编码器顺时针或逆时针旋转时,A相信号超前或滞后B相信号,FPGA接收到旋转编码器的A、B信号时,可以根据A、B的状态组合判定编码器的旋转方向。 程序设计中我们可以对A、B信号检测,检测A信号的边沿及B信号的状态, | 根据时序图可以看出旋转编码器顺时针或逆时针旋转时,A相信号超前或滞后B相信号,FPGA接收到旋转编码器的A、B信号时,可以根据A、B的状态组合判定编码器的旋转方向。 程序设计中我们可以对A、B信号检测,检测A信号的边沿及B信号的状态, | ||
行 121: | 行 121: | ||
===系统总体实现=== | ===系统总体实现=== | ||
+ | |||
+ | 回顾旋转调节系统设计框架,刚刚我们已经学习完成了旋转编码器的驱动设计,在基础数字电路实验部分我们已经掌握了FPGA驱动独立显示数码管的原理及方法, 模块通过一个4位的输入传递要显示的数值,通过9位的输出控制数码管显示该数值,这里我们不再重复,还需要设计一个模块,通过旋转编码器模块脉冲输出控制变量在0~99范围内加减变化。 | ||
+ | 关于BCD码在基础数字电路实验部分已经接触过,BCD码(Binarycoded Decimal),是用4位二进制码的组合代表十进制数的码制方法,这样显示更符合人的阅读习惯,所以BCD数值变化要求满9进1。 | ||
+ | |||
+ | 脉冲控制变量在0~99范围变化,左旋减,右旋加,程序实现如下 | ||
+ | <code verilog> | ||
+ | //key_pulse transfer to seg_data | ||
+ | always@(posedge clk or negedge rst_n) begin | ||
+ | if(!rst_n) begin | ||
+ | seg_data <= 8'h50; | ||
+ | end else begin | ||
+ | if(L_pulse) begin | ||
+ | if(seg_data[3:0]==4'd0) begin | ||
+ | seg_data[3:0] <= 4'd9; | ||
+ | if(seg_data[7:4]==4'd0) seg_data[7:4] <= 4'd9; | ||
+ | else seg_data[7:4] <= seg_data[7:4] - 1'b1; | ||
+ | end else seg_data[3:0] <= seg_data[3:0] - 1'b1; | ||
+ | end else if(R_pulse) begin | ||
+ | if(seg_data[3:0]==4'd9) begin | ||
+ | seg_data[3:0] <= 4'd0; | ||
+ | if(seg_data[7:4]==4'd9) seg_data[7:4] <= 4'd0; | ||
+ | else seg_data[7:4] <= seg_data[7:4] + 1'b1; | ||
+ | end else seg_data[3:0] <= seg_data[3:0] + 1'b1; | ||
+ | end else begin | ||
+ | seg_data <= seg_data; | ||
+ | end | ||
+ | end | ||
+ | end | ||
+ | </code> | ||
+ | |||
+ | 综合后的设计框图如下: | ||
+ | |||
+ | {{:4-rtl设计框图.png?800|rtl设计框图}} | ||