tianheiGE 发表于 2012-12-30 15:02:04

新手请教一个按键检测程序,和几个问题

想入门FPGA,所以下载了特权同学的视频教程现在看到按键检测部分,看完后就想按照自己的想法写下可是怎么也编译不过,这是我写的第二个Verilog程序,看的书太少所以不知道问题出在什么地方特来求助程序如下module KeyHandle(
                                          clk,
                                          rst_n,
                                          led,
                                          key
                                       );
                                       
inputclk;
inputrst_n;
inputkey;
output led;
                                       
//reg key_down <= 1'd0;
reg key_down;

/*检测是否是有键按下*/
always @(negedge key or negedge rst_n) begin
        if(!rst_n)
                key_down <= 1'd0;
        else
                key_down <= 1'd1;
end                                               

reg key_coun;
reg       key_flag;

/*如果有键按下了,则延时后在检测按键是否按下设置标志位*/
always @(negedge clk or negedge rst_n)        begin
        if(!rst_n) begin
                key_coun <= 1'd0;
                key_flag <= 1'd0;
                end
        else
        if(key_down) begin
                if(key_coun) begin
                        if(key == 0) key_flag <= 1'd1;
                        else key_down <= 1'd0;
                end
                else
                key_coun = key_coun + 1'd1;
                end
        else
                key_coun <= 1'd0;
end

reg d1;
                               
/*延时后确认真的按下了,则做相应的事*/
always @(negedge clk or negedge rst_n) begin
        if(!rst_n)
                d1 <= 1'd0;
        else if(key_flag) begin
                d1 <= ~d1;
                key_flag <= 1'd0;
                key_down <= 1'd0;
                end
        else
                d1 <= d1;
end                                       

assign led = d1;
                                       
endmodule编译出错提示如下:
Error (10028): Can't resolve multiple constant drivers for net "key_down" at KeyHandle.v(45)
Error (10029): Constant driver at KeyHandle.v(31)
Error (10028): Can't resolve multiple constant drivers for net "key_flag" at KeyHandle.v(63)
Error (10029): Constant driver at KeyHandle.v(45)
Error (12153): Can't elaborate top-level user hierarchy
Error: Quartus II 32-bit Analysis & Synthesis was unsuccessful. 5 errors, 0 warnings
        Error: Peak virtual memory: 311 megabytes
        Error: Processing ended: Sun Dec 30 14:31:54 2012
        Error: Elapsed time: 00:00:02
        Error: Total CPU time (on all processors): 00:00:01
Error (293001): Quartus II Full Compilation was unsuccessful. 7 errors, 0 warnings


另外还有几个不解的问题在这里求助一下:
1、//reg key_down <= 1'd0; 这样一句话为什么报错,Verilog不接收定义变量的时候赋初值吗?

2、inputclk;
   inputrst_n;
   inputkey;
   output led;
这样定义好输入输出后再映射对应管脚上后管脚是自动选择结构的吗,那时怎么样的,像单片机管脚输入可以有带上拉的和开漏的这些在这里是怎么实现的


kebaojun305 发表于 2012-12-30 15:53:58

本帖最后由 kebaojun305 于 2012-12-30 15:55 编辑

开漏输出实际上也是输出2种状态一种是输出0一种输出高阻z 上拉我记的 是在IO口属性中配置的。

tianheiGE 发表于 2012-12-30 16:09:59

kebaojun305 发表于 2012-12-30 15:53 static/image/common/back.gif
开漏输出实际上也是输出2种状态一种是输出0一种输出高阻z 上拉我记的 是在IO口属性中配置的。 ...

奥,多谢,也就是说这个在软件中是可以设置的吗

kebaojun305 发表于 2012-12-30 16:16:04

tianheiGE 发表于 2012-12-30 16:09 static/image/common/back.gif
奥,多谢,也就是说这个在软件中是可以设置的吗

开漏是要你自己用硬件语言描述出来的上拉 是IO属性中设置的。

tianheiGE 发表于 2012-12-30 16:22:35

kebaojun305 发表于 2012-12-30 16:16 static/image/common/back.gif
开漏是要你自己用硬件语言描述出来的上拉 是IO属性中设置的。

奥,了解了,多谢,

wuyuehang 发表于 2012-12-30 16:24:15

"、//reg key_down <= 1'd0; 这样一句话为什么报错,Verilog不接收定义变量的时候赋初值吗?
"
不支持寄存器变量在多个过程块里赋值,因为存在潜在的竞争问题所以编译器不会让你通过。
key_flag 也是类似的问题。想办法写到同一个块里。

tianheiGE 发表于 2012-12-30 16:29:57

wuyuehang 发表于 2012-12-30 16:24 static/image/common/back.gif
"、//reg key_down

奥,明白了,我再去试试看,多谢

wuyuehang 发表于 2012-12-30 16:35:25

tianheiGE 发表于 2012-12-30 16:29 static/image/common/back.gif
奥,明白了,我再去试试看,多谢

网络上有一份关于altera q2常见编译问题的解释以及解决办法,你可以搜一下,我这台电脑没有不方便传了。

tianheiGE 发表于 2012-12-30 16:56:51

wuyuehang 发表于 2012-12-30 16:35 static/image/common/back.gif
网络上有一份关于altera q2常见编译问题的解释以及解决办法,你可以搜一下,我这台电脑没有不方便传了。
...

嗯,搜了下看到几个博客里的,没有PDF的下载,谢谢,

tianheiGE 发表于 2012-12-30 17:22:44

左想右想我发现用C语言写单片机那套在这里很难实现,还是我没搞懂Verilog的语法规则{:cry:}
页: [1]
查看完整版本: 新手请教一个按键检测程序,和几个问题