差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
|
引脚分频说明 [2017/05/27 09:46] anran [硬件说明] |
引脚分频说明 [2017/07/20 13:50] (当前版本) anran [引脚分配] |
||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | ======STEP BaseBoard V2.X外设资源引脚分配说明====== | + | ======STEP-BaseBoard外设资源引脚分配说明====== |
| 本节将和大家一起了解[[STEP-Baseboard]]的资源及管脚分配的明细。 | 本节将和大家一起了解[[STEP-Baseboard]]的资源及管脚分配的明细。 | ||
| \\ | \\ | ||
| [[STEP-Baseboard]]是我们针对小脚丫核心板设计的扩展板,集成了大量常见外设,同时兼容[[STEP-MXO2第二代 ]]和[[STEP-MAX10 ]]两种小脚丫核心板,为开发者提供更多选择。 | [[STEP-Baseboard]]是我们针对小脚丫核心板设计的扩展板,集成了大量常见外设,同时兼容[[STEP-MXO2第二代 ]]和[[STEP-MAX10 ]]两种小脚丫核心板,为开发者提供更多选择。 | ||
| + | \\ | ||
| + | 为什么单独将引脚分配拉出来作为单独的一个章节呢,我们整个外设驱动后续所有章节都是只讲外设驱动模块的,在设计中往往只是作为其中的一个模块,作为桥接系统与人机界面的模块,很多引脚都是连接到系统的,无需分配管脚,所以就不在每个章节中谈管脚分配的话题了,这里独立一章同一说明。 | ||
| - | ====Verilog代码==== | ||
| - | ------ | ||
| - | <code verilog> | ||
| - | // -------------------------------------------------------------------- | ||
| - | // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< | ||
| - | // -------------------------------------------------------------------- | ||
| - | // Module: Array_KeyBoard | ||
| - | // | ||
| - | // Author: Step | ||
| - | // | ||
| - | // Description: Array_KeyBoard | ||
| - | // | ||
| - | // Web: www.stepfapga.com | ||
| - | // | ||
| - | // -------------------------------------------------------------------- | ||
| - | // 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 | ||
| - | 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; | ||
| - | //状态机根据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 | ||
| - | |||
| - | </code> | ||
| - | |||
| - | \\ | ||
| - | \\ | ||
| ====引脚分配==== | ====引脚分配==== | ||
| ------- | ------- | ||
| - | 综合(synthesize)完成之后一定要配置FPGA的引脚到相应的外设,这样下载FPGA程序后才能达到我们想要的效果。 | + | 在FPGA设计的过程中,综合(synthesize)完成之后一定要配置FPGA的引脚到相应的外设,这样下载FPGA程序后才能达到我们想要的效果。 |
| \\ | \\ | ||
| - | 我们使用PCLK充当程序中的clk_in,使用按键KEY1充当rst_n_in,col和row的引脚按照高低顺序分频,key_out可以分配给LED灯、三色灯、PMOD等FPGA控制输出的引脚上,通过观察或示波器测量检验设计 | + | 因为底板可同时兼容两款小脚丫核心板,当使用不同的核心板时外设的管脚资源改变,为了方便快速查找各资源的管脚分配信息,我们做了下面的表格: |
| \\ | \\ | ||
| {{ :step_baseboard_v2.2_引脚分配.jpg?1200 |}} | {{ :step_baseboard_v2.2_引脚分配.jpg?1200 |}} | ||
| \\ | \\ | ||
| - | ====小结==== | + | 上图中橙色表格中是我们底板[[STEP-BaseBoard]]集成的外设资源端口,下面为大家一一介绍: |
| - | ------ | + | |
| - | 本节主要为大家讲解了矩阵按键的工作原理及软件设计,需要大家掌握的同时自己创建工程,通过整个设计流程,生成FPGA配置文件加载测试。 | + | * I2C_SCL和I2C_SDA 为 底板上集成的I2C总线的SCL和SDA信号 |
| - | \\ | + | * TXD和RXD 为 底板上集成的CP2102的UART功能中的收发端口 |
| - | 如果你对Diamond软件的使用不了解,请参考这里:[[lattice_diamond的使用|Diamond的使用]]。 | + | * 595_DIN、595_RCK和595_SCK 为 底板上数码管模块的驱动芯片74HC595的串行端口 |
| + | * A_OUT、B_OUT和D_OUT 为 底板上旋转编码器EC11的三个接口 | ||
| + | * COL1、COL2、COL3、COL4 和 ROW4、ROW3、ROW2、ROW1 分别为 底板矩阵按键的列信号和行信号端口 | ||
| + | * PS2_CLK和PS2_DAT 为 PS2座子的信号端口 | ||
| + | * VSYNC、HSYNC、VGA_B、VGA_G、VGA_R 分别为 底板VGA接口的行场同步信号和RGB色彩信号端口 | ||
| + | * DS18B20Z 为 底板上温度传感器DS18B20Z芯片的信号端口 | ||
| + | * LCD_BL、LCD_D/C、LCD_RES、LCD_SDA、LCD_SCL 为 底板1.8寸RGB彩色液晶屏的信号端口 | ||
| + | * PD、PC、PB、PA 为 底板集成的PMOD接口的信号 | ||
| + | * BEEP 为 底板集成的无源蜂鸣器的控制端口 | ||
| + | |||
| + | 上图中黄色表格中是我们核心板集成的资源端口,图中已有相应注释,这里也不在赘述,也可以参考小脚丫核心板[[STEP-MXO2第二代 ]]和[[STEP-MAX10 ]]获取更详细的信息。 | ||
| + | |||
| + | 上图中绿色表格中是我们以上所有资源对应小脚丫核心板[[STEP-MXO2第二代 ]]的管脚分配信息。 | ||
| + | |||
| + | 上图中蓝色表格中是我们以上所有资源对应小脚丫核心板[[STEP-MAX10 ]]的管脚分配信息。 | ||
| + | |||
| ====相关资料==== | ====相关资料==== | ||
| ------ | ------ | ||
| - | 后期会有链接到云盘 | + | [[STEP-BaseBoard]] 硬件原理图 {{:step-baseboard_v2.2.pdf|}} |