搜索
bottom↓
回复: 6

学习CPLD两个星期了,交个CPLD读PS2键盘的作业~~~

[复制链接]

出0入0汤圆

发表于 2008-7-26 12:49:46 | 显示全部楼层 |阅读模式
已经下载到芯片里面用键盘验证过了,可以读出键值,不过由于没有加入校验,大概会有4%几率误码,这几天再补补~~哈哈~~
由于是刚学,程序有什么不规范的话麻烦各位大虾提醒啊~~THS~~~
module PS2(data,clock,led,clk,num,cat);
input data;
input clock;
input clk;
output [7:0]led;
output [6:0]num;
output cat;

wire data;              //PS2数据端
wire clock;             //PS2时钟端
wire clk;
reg [7:0]led;            //用于二极管显示
reg [6:0]num;              //用于数码管显示
reg cat;                  //数码管位选

reg [7:0]data_ram;
reg start;                    //开始读取键码标志位
reg [3:0]count;              //计数读取的键码
reg [2:0]i;                   //循环计数用
reg odd;                        //奇偶校验标志
reg [3:0]num_high;             //数码管显示高位
reg [3:0]num_low;               //数码管显示低位

initial
begin
led=0;
data_ram=0;
start=0;
count=11;
i=0;
num_high=0;
num_low=0;
num=0;
cat=0;
end

always@(negedge clock)
begin
if(data==0)
start=1;
else
start=start;

if(start==1)
begin
count=count-1;

if(count>1&&count<10)        //存储键值
begin
data_ram=data;
i=i+1;
end

else if(count==1)
odd=data;

else if(count==0)
begin
count=11;
i=0;
start=0;
end

else
count=count;
end

else
count=count;

end

always@(negedge start)
begin
led=data_ram;                      //led是8位的发光二极管,用来显示键码~~
{num_high,num_low}=data_ram;
end

always@(posedge clk)                //七段数码管显示部分
begin
cat=~cat;
if(cat==1)
seven(num_high,num);
else
seven(num_low,num);
end
/////////////////////////////////////////////////////////////////////////////

task seven;                       //数码管显示任务
input [3:0]num;
output [6:0]seg_task;

reg [6:0]seg_reg;

begin
case(num)
4'h0:seg_reg=7'b1000000;
4'h1:seg_reg=7'b1111001;
4'h2:seg_reg=7'b0100100;
4'h3:seg_reg=7'b0110000;
4'h4:seg_reg=7'b0011001;
4'h5:seg_reg=7'b0010010;
4'h6:seg_reg=7'b0000010;
4'h7:seg_reg=7'b1111000;
4'h8:seg_reg=7'b0000000;
4'h9:seg_reg=7'b0010000;
4'ha:seg_reg=7'b0001000;
4'hb:seg_reg=7'b0000000;
4'hc:seg_reg=7'b1000110;
4'hd:seg_reg=7'b1000000;
4'he:seg_reg=7'b0000110;
4'hf:seg_reg=7'b0001110;
default:seg_reg=7'b1111111;
endcase
seg_task=~seg_reg;
end
endtask


endmodule

出0入0汤圆

发表于 2008-7-28 22:06:02 | 显示全部楼层
嗨! LZ 你用的板是自己做的还是买的?我也想学下CPLD 介绍下了 THS!

出0入0汤圆

发表于 2008-7-28 23:17:10 | 显示全部楼层
呵呵 等待楼主学习的新作~

出0入0汤圆

 楼主| 发表于 2008-7-28 23:28:33 | 显示全部楼层
板是亲戚在XILINX那帮我申请的,X-board,CPLD coolrunner2,这个板自带USB下载,适合我的本本~~哈哈~~

出0入0汤圆

 楼主| 发表于 2008-7-29 22:46:36 | 显示全部楼层
已经加奇偶校验啦~~不过还是有1%——2%的误码~~
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date:    23:44:11 07/22/2008
// Design Name:
// Module Name:    PS2
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module PS2(data,clock,led,clk,num,cat);
input data;
input clock;
input clk;
output [7:0]led;
output [6:0]num;
output cat;

wire data;
wire clock;
wire clk;
reg [7:0]led;
reg [6:0]num;
reg cat;

reg [7:0]data_ram;
reg start;
reg [3:0]count;
reg [2:0]i;
reg pass;
reg [3:0]num_high;
reg [3:0]num_low;

initial
begin
led=0;
data_ram=0;
start=0;
count=11;
i=0;
num_high=0;
num_low=0;
num=0;
cat=0;
end

always@(negedge clock)
begin
if(data==0)
begin
start=1;
pass=0;
end
else
start=start;

if(start==1)
begin
count=count-1;

if(count>1&&count<10)
begin
data_ram=data;
i=i+1;
end

else if(count==1)
begin
        if(data!=^data_ram)
        pass=1;
        else
        pass=0;
end

else if(count==0)
begin
count=11;
i=0;
start=0;
end

else
count=count;
end

else
count=count;

end

always@(negedge start)
begin
        if(pass==1)
        begin
                led=data_ram;
                {num_high,num_low}=data_ram;
        end
        else
        led=led;
end

always@(posedge clk)
begin
cat=~cat;
if(cat==1)
seven(num_high,num);
else
seven(num_low,num);
end
/////////////////////////////////////////////////////////////////////////////

task seven;
input [3:0]num;
output [6:0]seg_task;

reg [6:0]seg_reg;

begin
case(num)
4'h0:seg_reg=7'b1000000;
4'h1:seg_reg=7'b1111001;
4'h2:seg_reg=7'b0100100;
4'h3:seg_reg=7'b0110000;
4'h4:seg_reg=7'b0011001;
4'h5:seg_reg=7'b0010010;
4'h6:seg_reg=7'b0000010;
4'h7:seg_reg=7'b1111000;
4'h8:seg_reg=7'b0000000;
4'h9:seg_reg=7'b0010000;
4'ha:seg_reg=7'b0001000;
4'hb:seg_reg=7'b0000000;
4'hc:seg_reg=7'b1000110;
4'hd:seg_reg=7'b1000000;
4'he:seg_reg=7'b0000110;
4'hf:seg_reg=7'b0001110;
default:seg_reg=7'b1111111;
endcase
seg_task=~seg_reg;
end
endtask


endmodule

出0入46汤圆

发表于 2008-9-5 10:56:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-6 14:43:32 | 显示全部楼层
学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 16:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表