在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1739|回复: 3

[求助] PS2入门程序调试出错,请教高手

[复制链接]
发表于 2015-4-5 22:17:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
出现了2个问题:
1、程序没有出错,但是逻辑单元居然使用率为0,这是为什么?
2、按PS2键盘的时序,一帧为11,第一位不管,2到9为数据,读取,10校验,11是结束位也就是断码F0位,这样理解不知道对不对,我按这样的理解写的程序读不到正确的值。


================================顶层文件=======================================


module ps2_top (
        input clk,
        input rstn,
        input ps2_clk,
        input ps2_data,
        output [3:0]led

);

wire [7:0]ps2_data_decode;
wire h2l_sig;
wire ps2_keyup_sig;

ps2_h2l_sig u1(
        .clk(clk),                                 //input clk,                        from top
        .rstn(rstn),                         //input rstn,                       from top
        .ps2_clk(ps2_clk),                   //input ps2_clk,                    from top
        .h2l_sig(h2l_sig)                    //output h2l_sig
);

ps2_decode u2(
        .clk(clk),                            //        input clk,                      from top
        .rstn(rstn),                          //        input rstn,                     from rstn
        .h2l_sig(h2l_sig),                    //        input h2l_sig,                  from u1
        .ps2_data_in(ps2_data),               //        input ps2_data_in,              from top
        .ps2_data_decode(ps2_data_decode),    //        output [7:0]ps2_data_decode,
        .ps2_keyup_sig(ps2_keyup_sig)         //  output ps2_keyup_sig
);

ps2_led u3(
        .clk(clk),                            //        input clk,                      from top
        .rstn(rstn),                          //        input rstn,                     from top
        .ps2_data_decode_in(ps2_data_decode), //        input ps2_data_decode_in,       from u2
        .ps2_keyup_sig(ps2_keyup_sig),        //        input ps2_keyup_sig,            from u2
        .led(led)                             //        output [3:0]led
);

endmodule
======================================高低电平检测模块==============================


module ps2_h2l_sig (
        input clk,
        input rstn,
        input ps2_clk,
        output h2l_sig

);

reg h2l_sig_pre;
reg h2l_sig_now;

always@(posedge clk or negedge rstn)
begin
        if(!rstn==1)
        begin
                h2l_sig_pre<=1'b1;
                h2l_sig_now<=1'b1;
        end else
        begin
                h2l_sig_now<=ps2_clk;
                h2l_sig_pre<=h2l_sig_now;
        end
end

assign h2l_sig=(!h2l_sig_now)&h2l_sig_pre;

endmodule
=====================================键盘解码模块================================


module ps2_decode (
        input clk,
        input rstn,
        input h2l_sig,
        input ps2_data_in,
        output [7:0]ps2_data_decode,
        output ps2_keyup_sig
);

reg [7:0]temp_data;
reg [4:0]i;
reg keyup_sig;

always@(posedge clk or negedge rstn)
begin
        if(!rstn==1)
        begin
                temp_data<=8'b0;
                i<=0;
                keyup_sig<=0;
        end else
        begin
                case(i)
                        4'd0:
                        begin
                                if(h2l_sig)
                                begin
                                        i<=i+1'b1;
                                end       
                        end
                       
                        4'd1,4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8:
                        begin
                                if(h2l_sig)
                                begin
                                        i<=i+1'b1;
                                        temp_data[i-1]<=ps2_data_in;
                                end       
                        end
                       
                        4'd9,4'd10:
                        begin
                                if(h2l_sig)
                                begin
                                        i<=i+1'b1;
                                end       
                        end

                        4'd11:
                        begin
                                i<=0;
                                keyup_sig<=1;
                        end
       
                endcase
        end
end

assign ps2_data_decode=temp_data;
assign ps2_keyup_sig=keyup_sig;


endmodule
=======================================LED控制模块==========================


module ps2_led(
        input clk,
        input rstn,
        input ps2_data_decode_in,
        input ps2_keyup_sig,
        output [3:0]led
);

reg [3:0]temp_led;

always@(posedge clk or negedge rstn)
begin
        if(!rstn==1)
        begin
                temp_led<=4'b0001;
        end else
        begin
                case(ps2_data_decode_in)
                        8'h1d: temp_led<={temp_led[2:0], temp_led[3]};
                        8'h22: temp_led<={temp_led[2:0], temp_led[3]};
                endcase
        end
end

assign led=temp_led;

endmodule
发表于 2015-4-6 06:40:46 | 显示全部楼层
verilog牛
 楼主| 发表于 2015-4-6 20:26:47 | 显示全部楼层
那位大拿能回答一下?
发表于 2015-5-11 16:47:05 | 显示全部楼层
回复 1# odbc1230
你理解的不对,F0也是2-9 的8位数据位,并不是第11位停止位。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-6 05:19 , Processed in 0.030289 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表