2022.3.15 工作记录 上班第二天
1.用cadence绘制原理图
STM32F767IGT6
**原理图绘制方法:**根据对应芯片手册datasheet查找对应的引脚如何接入电路,比如:
ALLDATASHEET.com上有很多手册,例如找SiT9121芯片
看出SiT9121使用LVDS协议电路图如下,参考这个电路进设计。
2.FPGA按键消抖
按键的消抖,是指按键在闭合或松开的瞬间伴随着一连串的抖动,这样的抖动将直接影响设计系统的稳定性,降低响应灵敏度。因此,必须对抖动进行处理,即消除抖动的影响。实际工程中,有很多消抖方案,如 RS 触发器消抖,电容充放电消抖,软件消抖。本章利用 FPGA 内部来设计消抖,即采取软件消抖。
按键的机械特性,决定着按键的抖动时间,一般抖动时间在 5ms~10ms。消抖,也意味着,每次在按键闭合或松开期间,跳过这段抖动时间,再检测按键的状态。只要通过简单的延时就可实现按键的消抖动。
module key #
(
parameter CLK_FREQ = 100000000
)
(
input clk_i,
input key_i,
output key_cap
);
//10ms
parameter CNT_10MS = (CLK_FREQ/100 - 1'b1);
parameter KEY_S0 = 2'd0;
parameter KEY_S1 = 2'd1;
parameter KEY_S2 = 2'd2;
parameter KEY_S3 = 2'd3;
reg [24:0] cnt10ms = 25'd0;
(*mark_debug = "true"*) reg [1:0] key_s = 2'b0;
(*mark_debug = "true"*) reg [1:0] key_s_r = 2'b0;
(*mark_debug = "true"*) wire en_10ms ; assign en_10ms = (cnt10ms == CNT_10MS);
assign key_cap = (key_s==KEY_S2)&&(key_s_r==KEY_S1);
always @(posedge clk_i)begin
if(cnt10ms < CNT_10MS)
cnt10ms <= cnt10ms + 1'b1;
else
cnt10ms <= 25'd0;
end
always @(posedge clk_i)begin
key_s_r <= key_s;
end
always @(posedge clk_i)begin
if(en_10ms)begin
case(key_s)
KEY_S0:begin
if(!key_i)
key_s <= KEY_S1;
end
KEY_S1:begin
if(!key_i)
key_s <= KEY_S2;
else
key_s <= KEY_S0;
end
KEY_S2:begin
if(key_i)
key_s <= KEY_S3;
end
KEY_S3:begin
if(key_i)
key_s <= KEY_S0;
else
key_s <= KEY_S2;
end
endcase
end
end
endmodule
KEY_S0:判断按键是否按下,如果是,转移到状态 KEY_S1;
KEY_S1:10ms 后再次判断按键是否按下,如果是,转移状态到 KEY_S2,否则继续回到 KEY_S0;
KEY_S2:判断按键是否抬起,如果是,转移状态到 KEY_S3
KEY_S3:10ms 后再次判断按键是否抬起,如果是,转移状态到 KEY_S0,否则继续回到 KEY_S2;
当状态从 KEY_S1 转到 KEY_S2 代表依次按钮按下 key_cap 输出一次高电平。