|
已经下载到芯片里面用键盘验证过了,可以读出键值,不过由于没有加入校验,大概会有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 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|