差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
引脚分频说明 [2017/05/27 09:31]
anran [STEP BaseBoard V2.X外设资源引脚分配说明]
引脚分频说明 [2020/01/18 21:25] (当前版本)
gongyu
行 1: 行 1:
-======STEP BaseBoard ​V2.X外设资源引脚分配说明====== +### STEP-BaseBoard外设资源引脚分配说明
 本节将和大家一起了解[[STEP-Baseboard]]的资源及管脚分配的明细。 本节将和大家一起了解[[STEP-Baseboard]]的资源及管脚分配的明细。
 \\ \\
 +
 [[STEP-Baseboard]]是我们针对小脚丫核心板设计的扩展板,集成了大量常见外设,同时兼容[[STEP-MXO2第二代 ]]和[[STEP-MAX10 ]]两种小脚丫核心板,为开发者提供更多选择。 [[STEP-Baseboard]]是我们针对小脚丫核心板设计的扩展板,集成了大量常见外设,同时兼容[[STEP-MXO2第二代 ]]和[[STEP-MAX10 ]]两种小脚丫核心板,为开发者提供更多选择。
 +\\
  
-====硬件说明==== +为什么单独将引脚分配拉出来作为单独的一个章节呢,我们整个外设驱动后续所有章节都是只讲外设驱动模块的,设计往往只是作为其中的一个模块桥接系统与人机界面模块很多引脚都是连接到系统的,无需分配管脚,所就不在每章节中谈管脚分配的话题了这里独立一章同一说明。
-------- +
-键盘按键数量较多时,为了减少I/​O口占用通常将按键排列成矩阵形式,使用行线和列线分别连接到按键开关两端这样我们就可通过4根行线和4根列线(共8I/​O口)连接16个按键而且按键数量越多优势越+
  
-FPGA驱动矩阵按键模块,首先我们来了解矩阵按键的硬件连接: +--- 
-\\ +#### 引脚分配 
-{{ :​矩阵按键.jpg?​800 |}} +在FPGA设计的过程中综合(synthesize)完成之后一定要配置FPGA的引脚到相应的外设,这载FPGA程序后能达我们想要效果
-\\ +
-上图为4x4矩阵按键硬件电路图,可以看到4根行线(ROW1、ROW2、ROW3、ROW4)和4根列线(COL1、COL2、COL3、COL4),同时列线通上拉电阻连接到VCC电压(3.3V)对于矩阵按键来讲: +
-  - 4根行线是输入的,是由FPGA控制拉高或拉低, +
-  - 4根列线数输出,是由4根行线的输入及按键的状态决定,输出给FPGA +
-当某一时刻,FPGA控制4根行线分别为ROW1=0、ROW2=1、ROW3=1、ROW4=1时, +
-  *   ​对于K1、K2、K3、K4按键:按下时对4根列线输出COL1=0、COL2=0、COL3=0、COL4=0,不按时对应4根列线输出COL1=1、COL2=1、COL3=1、COL4=1, +
-  *   ​对于K5~~~K16之间按键:无论按下与否对应4根列线输出COL1=1、COL2=1、COL3=1、COL4=1, +
-通过上面的描述:在一时刻只有K1、K2、K3、K4按键被按会导致4根列线输出COL1=0、COL2=0、COL3=0、COL4=0,否则COL1=1、COL2=1、COL3=1、COL4=1,反之当FPGA检测列线(COL1、COL2、COL3、COL4)中有低电平信号时,对应K1、K2、K3、K4按键应该是被按下了+
  
-按照扫描的方式,一共分为4个时刻,分别对应4根行线中的一根拉低,4个时刻一次循环,这样就完成了矩阵按键的全部扫描检测,我们在程序中以这4个时刻对应状态机的4个状态。 
-至于循环的周期,根据我们基础教程里可知,按键抖动的不稳定时间在10ms以内,所以对同一个按键采样的周期大于10ms,这同样取20ms时间。20ms时间对应4个状态,每5分钟进行一次状态转换。 
 \\ \\
-{{ :​矩阵按键程序框图.jpg?​800 |}}+因为底板可同时兼容两款小脚丫核心板,当使用不同的核心板时外设的管脚资源改变,为了方便快速查找各资源的管脚分配信息,我们做了下面的表格:
 \\ \\
-{{ :矩阵按键扫描法原理.jpg |}}+{{ :step_baseboard_v2.2_引脚分配.jpg?1200 |}}
 \\ \\
-====Verilog代码==== +上图中橙色表格中是我们底板[[STEP-BaseBoard]]集成的外设资源端口,下面为大家一一介绍:
------- +
-<code verilog>+
  
-// -------------------------------------------------------------------- +  ​* I2C_SCL和I2C_SDA 为 底板上集成的I2C总线的SCL和SDA信号 
-// >>>>>>>>>>>>>>>>>>>>>>>>>​ COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<​ +  * TXD和RXD 为 底板上集成的CP2102的UART功能中的收发端口 ​ 
-// -------------------------------------------------------------------- +  * 595_DIN、595_RCK和595_SCK 为 底板上数码管模块的驱动芯片74HC595的串行端口 ​ 
-// Module: Array_KeyBoard +  * A_OUT、B_OUT和D_OUT 为 底板上旋转编码EC11三个接口 
-//  +  * COL1、COL2、COL3、COL4 和 ROW4、ROW3、ROW2、ROW1 分别为 底板矩阵按键的列信号和信号端口 
-// Author: Step +  * PS2_CLK和PS2_DAT 为 PS2座子的信号端口 
-//  +  VSYNC、HSYNC、VGA_B、VGA_G、VGA_R ​为 底板VGA接口行场同步信号和RGB色彩信号端口 
-// Description:​ Array_KeyBoard +  * DS18B20Z 为 底板上温度传感器DS18B20Z芯片信号端口 
-//  +  LCD_BL、LCD_D/C、LCD_RES、LCD_SDA、LCD_SCL 为 底板1.8寸RGB彩色液晶屏的信号端口 
-// Web: www.stepfapga.com +  * PD、PC、PB、PA 为 底板集成的PMOD接口的信号 
-// +  * BEEP 为 底板集成的无源蜂鸣器的控制端口
-// -------------------------------------------------------------------- +
-// Code Revision History : +
-// -------------------------------------------------------------------- +
-// Version: |Mod. Date:   ​|Changes Made: +
-// V1.0     ​|2015/​11/​11 ​  ​|Initial ver +
-// -------------------------------------------------------------------- +
-module Array_KeyBoard # +
-+
- parameter NUM_FOR_200HZ = 60000 //​定义计数cnt计数范围,例化时可更改 +
-+
-+
- input clk_in,​ //​系统时钟 +
- input rst_n_in,​ //​系统复位,低有效 +
- input [3:​0] col,​ //​矩阵按键列接口 +
- output reg [3:​0] row,​ //​矩阵按键行口 +
- output reg [15:​0] key_out //​消抖后的信号 +
-); +
-/* +
-因使用4x4矩阵按键,通过扫描方法实现,所以这里使用状态机实现,共分为4种状态 +
-在其中某一状态时间里,对应的4个按键相当于独立按键,可按独立按键的周期采样法采样 +
-周期采样时每隔20ms采样一次,对应这里状态机每隔20ms循环一次,每个状态对应5ms时间 +
-对矩阵按键实现原理不明白,请去了解矩阵按键实现原理 +
-*/  +
- localparam STATE0 = 2'b00; +
- localparam STATE1 = 2'​b01;​ +
- localparam STATE2 = 2'​b10;​ +
- localparam STATE3 = 2'b11;+
  
- //​计数器计数分频实现5ms周期信号clk_200hz +上图中黄色表格中是我们核心板集成的资源端口已有应注释,这里也不在赘述,也可以参考小脚丫核心板[[STEP-MXO2第二代 ]]和[[STEP-MAX10 ]]获更详细的信息。
- reg [15:​0] cnt;​ +
- reg clk_200hz;​ +
- always@(posedge clk_in or negedge rst_n_in) begin +
- if(!rst_n_in) begin //​复位时计数器cnt清零clk_200hz信号起始电平为低电平 +
- cnt <= 16'​d0;​ +
- clk_200hz <= 1'​b0;​ +
- end else begin +
- if(cnt >= ((NUM_FOR_200HZ>>​1) - 1)) begin //​数字逻辑右移1位当于除2 +
- cnt <= 16'​d0;​ +
- clk_200hz <= ~clk_200hz;​ //​clk_200hz信号反 +
- end else begin +
- cnt <= cnt + 1'​b1;​ +
- clk_200hz <= clk_200hz;​ +
- end +
- end +
- end+
  
- reg [1:​0] c_state;​ +上图中绿色表格是我们以上所资源对应小脚丫核心板[[STEP-MXO2第二代 ​]]的管脚分配信息。
- //​状态机根据clk_200hz信号在4个状态间循环,每个状态对矩阵按键的行接口单行有效 +
- always@(posedge clk_200hz or negedge rst_n_in) begin +
- if(!rst_n_in) begin +
- c_state <= STATE0; +
- row <= 4'​b1110;​ +
- end else begin +
- case(c_state) +
- STATE0: begin c_state <= STATE1; row <= 4'​b1101;​ end //​状态c_state跳转及对应状态下矩阵按键的row输出 +
- STATE1: begin c_state <= STATE2; row <= 4'​b1011;​ end +
- STATE2: begin c_state <= STATE3; row <= 4'​b0111;​ end +
- STATE3: begin c_state <= STATE0; row <= 4'​b1110;​ end +
- default:​begin c_state <= STATE0; row <= 4'​b1110;​ end +
- endcase +
- end +
- end +
-  +
- //​因为每个状态单行效,通过对列接口的电平状态采样得到对应4个按键的状态,依次循环 +
- always@(negedge clk_200hz or negedge rst_n_in) begin +
- if(!rst_n_in) begin +
- key_out <= 16'​hffff;​ +
- end else begin +
- case(c_state) +
- STATE0:​key_out[3:0] <= col;​ //​采集当前状态的列数据赋值给对应的寄存器位 +
- STATE1:​key_out[7:4<= col; +
- STATE2:​key_out[11:​8<= col; +
- STATE3:​key_out[15:​12] <= col; +
- default:​key_out <= 16'​hffff;​ +
- endcase +
- end +
- end+
  
-endmodule+上图中蓝色表格中是我们以上所有资源对应小脚丫核心板[[STEP-MAX10 ]]的管脚分配信息。
  
-</​code>​ 
- 
-\\  ​ 
-\\  ​ 
-====引脚分配==== 
-------- 
-综合(synthesize)完成之后一定要配置FPGA的引脚到相应的外设,这样下载FPGA程序后才能达到我们想要的效果。 
-\\ 
-我们使用PCLK充当程序中的clk_in,使用按键KEY1充当rst_n_in,col和row的引脚按照高低顺序分频,key_out可以分配给LED灯、三色灯、PMOD等FPGA控制输出的引脚上,通过观察或示波器测量检验设计 
-\\ 
-{{ :​step_baseboard_v2.2_引脚分配.jpg?​1200 |}} 
-\\ 
-====小结==== 
------- 
-本节主要为大家讲解了矩阵按键的工作原理及软件设计,需要大家掌握的同时自己创建工程,通过整个设计流程,生成FPGA配置文件加载测试。 
-\\ 
-如果你对Diamond软件的使用不了解,请参考这里:[[lattice_diamond的使用|Diamond的使用]]。 
  
-====相关资料==== +--- 
------- +#### 相关资料 
-后期会有链接到云盘+[[STEP-BaseBoard]] 硬件原理图 {{:step-baseboard_v2.2.pdf|}}