2012-01-19 112 views
1

作为一个大型程序的一部分,我想在DE2板上依次激活绿色LED(0到8),当我按下按键[1]时。当我按下按键[2]时,它们应该以相反的顺序一次关闭一个。我很确定DE2板键是低电平有效的。这是我的代码:始终阻止被忽略

[email protected](negedge KEY[1], negedge KEY[2]) 
begin 

    if(~KEY[1]) 
    begin 
     LEDGValue <= LEDGValue << 1; 
     LEDGValue[0] <= 1; 
    end 

    else if(~KEY[2]) 
     LEDGValue[0] <= LEDGValue >> 1; 

end 

而是所有的绿色LED指示灯一亮起来,只要我加载程序。此时KEY [1]和KEY [2]无效。任何人都看到我的代码有问题吗?

回答

2

下面是一个边缘检测器。

module edge_detector (
    input wire clk, 
    input wire in, 
    output wire negedge_out 
); 

reg in_reg= 1'b0; 

wire in_next = in; 

assign negedge_out = ({in_reg,in) == 2'b10); 

always @(posedge clk) in_reg <= in_next; 

endmodule 

下面介绍如何使用边缘检测器。

reg [8:0] LEDGValue = 0, LEDGValue_next; 

wire key1_edge; 
wire key2_edge; 

edge_detector 
key1_edge_detector_inst (
    .clk(clk), 
    .in(KEY[1]), 
    .negedge_out(key1_edge) 
); 

edge_detector 
key2_edge_detector_inst (
    .clk(clk), 
    .in(KEY[2]), 
    .negedge_out(key2_edge) 
); 

always @* begin : combinational_logic 
    LEDGValue_next = LEDGValue; 
    if (key1_edge) 
     LEDGValue_next = {LEDGValue[7:0], 1'b1}; 
    else if (key2_edge) 
     LEDGValue_next = {1'b0, LEDGValue[8:1]}; 
end 

always @(posedge clk) begin : sequential_logic 
    LEDGValue <= LEDGValue_next; 
end 

的关键是,key1_edgekey2_edge信号仅用于单个时钟周期断言。

+0

该代码是非常有帮助的;它解决了这个问题。谢谢。 – Andrew 2012-01-21 21:01:55

+0

因为没有时钟,所以你所要做的就是所谓的异步逻辑。事实证明,FPGA设计的假设是所有逻辑都是同步的并将使用时钟。在FPGA上实现异步逻辑是可能的,但现在这是一场艰苦的战斗,最好还是留给专家。 – 2012-01-22 01:51:34

0

我不是Verilogger,但看起来好像你在要求代码触发两个不同的信号的边沿。这不是我可以合成的体验,但合成器可能会尝试,并警告(除了其他警告之外),它的做法并非你真正意义上的。


编辑:以下不适用于提及,因为它已经消除抖动船上硬件(感谢NathanFarrington指出了这一点),但我离开这里的情况下,它是使用于其他读者的板:


即使合成成功,边沿触发的开关输入是一种可怕的想法:the switch will bounce several times当你按下它,而FPGA很容易足够快的看到所有的边。

你需要的是一个从一个好的时钟源(毫无疑问是一块晶体)的时钟来监控每个时钟事件的开关信号。

为每个信号保留一个计数器,每当信号为1时递增一次,每当信号为0时递减。将这些计数器钳位在0处,并且允许有足够的时间让交换机稳定下来(一些毫秒可能就足够了)。

一旦计数器达到其“旅行”的任何一端,只有然后你采取了一些行动(如移动你的LEDGValue)。记住等待开关被释放后(等待计数到另一端)。

+0

此链接表示四个按钮已经使用施密特触发器进行了去抖动,因此在FPGA中无需执行任何操作:http://courses.engr.illinois.edu/ece385/documents/DE2_UserManual.pdf – 2012-01-19 12:08:59

+0

@NathanFarrington :谢谢,我没有意识到董事会的细节......我会更新我的答案 – 2012-01-19 15:07:40

-1

它应该是

[email protected](negedge KEY[1] OR negedge KEY[2]) 
+1

2分:1. Verilog区分大小写:'OR'应该是'or'。 2.逗号支持IEEE 1364-2001规范的语法。 – toolic 2012-01-19 14:46:38

+0

事实上,我还没有使用Verilog的年龄 – xucheng 2012-01-19 15:48:21