2926|1

569

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

ps2键盘控制 [复制链接]

PS2键盘控制实验
这是一个主机和键盘的双向通讯的实验,扫描码在四个数码管上显示,其中包括分频电路,键盘电路和显示电路,在分频和键盘电路上存有疑惑和问题,恳请大家帮忙。分频电路为:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity divclk is
port(
     clk : in std_logic;     ------50MHZ
          clk400 : out std_logic;    -------400KHZ
          scanclk : out std_Logic
          );
end divclk;

architecture Behavioral of divclk is

begin

process(clk)
variable count : std_logic_vector(19 downto 0):=X"00000";
begin
if(rising_edge(clk))then
   count:=count+1;
end if;
clk400<=count(2);
scanclk<=count(12);
end process;

end Behavioral;
在此程序中是怎么得到400KHZ和25HZ的?
键盘的程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity key_board is
port( clr    : in std_logic;
      clk400 : in std_logic;   --400KHZ
      ps2clk : in std_logic;
                ps2data : in std_logic;
                dataout : out std_logic_vector(15 downto 0)
     );
end key_board;

architecture Behavioral of key_board is
signal clk : std_logic:='0';
signal data : std_logic:='0';
signal shift1,shift2 : std_logic_vector(10 downto 0);
signal ps2c,ps2d : std_logic;
begin
ps2c<=ps2clk;
ps2d<=ps2data;
dataout<=shift1(8 downto 1) & shift2(8 downto 1);
process(clk400,clr)
variable tempclk : std_logic_vector(7 downto 0):=X"00";
variable tempdata: std_logic_vector(7 downto 0):=X"00";
begin
if(clr='0') then
  tempclk:=X"00";
  tempdata:=X"00";
  clk<='0';
  data<='0';
else if(clk400'event and clk400='1') then
      tempclk(0):=ps2c;
                tempclk(7 downto 1):=tempclk(6 downto 0);
                tempdata(0):=ps2d;
                tempdata(7 downto 1):=tempdata(6 downto 0);
end if;
end if;

if(tempclk="11111111") then
clk<='1';
else
    if(tempclk="00000000") then
         clk<='0';
     end if;
end if;


if(tempdata="11111111") then
data<='1';
else
  if(tempdata="00000000") then
    data<='0';
  end if;
end if;

end process;
process(clk,clr)
begin
if(clr='0')then
shift1<=(others => '0');
shift2<=(others => '0');
else if(clk'event and clk='0') then
   shift1(10)<=data;
        shift1(9 downto 0)<=shift1(10 downto 1);
        shift2(10)<=shift1(0);
        shift2(9 downto 0)<=shift2(10 downto 1);
end if;
end if;
end process;

end Behavioral;
哪位高手能给解析一下这个程序?谢谢!
此帖出自FPGA/CPLD论坛

最新回复

根据本人综合上面的信息理解: process(clk)variable count : std_logic_vector(19 downto 0):=X"00000";beginif(rising_edge(clk))then   count:=count+1;end if;clk400<=count(2);scanclk<=count(12);end process;end Behavioral;在此程序中是怎么得到400KHZ和25HZ的?是不对的   正确的分频后的结果是:50M/4096=Clk400; 50M/4=12.5MHZ;  详情 回复 发表于 2010-10-25 15:18
点赞 关注
 

回复
举报

6892

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

根据本人综合上面的信息理解:

process(clk)
variable count : std_logic_vector(19 downto 0):=X"00000";
begin
if(rising_edge(clk))then
   count:=count+1;
end if;
clk400<=count(2);
scanclk<=count(12);
end process;

end Behavioral;
在此程序中是怎么得到400KHZ和25HZ的?是不对的

 

正确的分频后的结果是:50M/4096=Clk400;

50M/4=12.5MHZ;

此帖出自FPGA/CPLD论坛
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表