2014-12-05 91 views
0

我想从物理开关中获取4个输入,并基于它们的状态发送到2个引脚上我已在CPLD上打开一个1或一个0.我完全失去了如何做到这一点..........这是我迄今为止所拥有的。有任何想法吗?Verilog输入和二进制输出

module count_osc (rstn, osc_clk, clk, LED, but1, but2, but3, but4, STM); 

input rstn; 
input but1, but2, but3, but4; 
output osc_clk; 
output clk; 
output [2:0] STM; 
output [7:0] LED; 

GSR GSR_INST (.GSR(rstn));   
OSCC OSCC_1 (.OSC(osc_clk)); 

reg [3:0] switches;    
reg [7:0] LED; 
reg [2:0] STM; 

always @(but1 || but2 || but3 || but4) begin 
    if(but2 && but4 && !but1 && !but3) 
     STM = 4'b0000; 
    else if(but2 && but3 && !but1 && !but4) 
     STM = 4'b0001; 
    else if(but1 && but3 && !but2 && !but4) 
     STM = 4'b0010; 
    else if(but1 && but2 && but3 && !but4) 
     STM = 4'b0011 
    end 
endmodule 
+0

我试图建立一个基于我的开关状态切换的情况,但也失败了。一个案例似乎更适合我,但是作为一个非常薄弱的​​程序员,我无法把头围绕在这。 – Sagebrushwilly 2014-12-05 00:52:41

回答

1

只需修改

always @(but1 || but2 || but3 || but4) begin 

always @(but1, but2, but3, but4) begin 

,它会:-)

always @(but1 || but2 || but3 || but4)工作并不意味着“当任何but1的.. but4变化“而是”当通过逻辑或操作获得的信号时t1 .. but4 changes“

if..else阶梯中的另一个问题:您需要指定else条件。如果没有其他明确的说明,当if..elseif情况下提到的条件都不存在时,仿真器不知道如何驱动STM;在这种情况下,它通常会试图保留STM的以前的值。这可能不是您期望的代码所要做的。另一个问题是,由于STM在模拟开始时没有分配任何值,您可能最终在很长时间内看到X.

2

要添加到@navs的答案我会替换手动灵敏度自动列出一次,以减少RTL到门(综合)不匹配的机会。

always @(but1, but2, but3, but4) begin 

变为:

always @* begin 

看你的条件句,如果你保持在同一顺序的观点会更容易理解:

if(but2 && but4 && !but1 && !but3) 
    STM = 4'b0000; 
else if(but2 && but3 && !but1 && !but4) 
    STM = 4'b0001; 
else if(but1 && but3 && !but2 && !but4) 
    STM = 4'b0010; 
else if(but1 && but2 && but3 && !but4) 
    STM = 4'b0011 
end 

变为:

if(!but1 && but2 && !but3 && but4) 
    STM = 4'b0000; 
else if(!but1 && but2 && but3 && !but4) 
    STM = 4'b0001; 
else if(but1 && !but2 && but3 && !but4) 
    STM = 4'b0010; 
else if(but1 && but2 && but3 && !but4) 
    STM = 4'b0011 
end 

This now bec omes更容易变成一个case语句:

case({but1,but2,but3,but4}) 
    4'b0101 : STM = 4'b0000; 
    4'b0110 : STM = 4'b0001; 
    4'b1010 : STM = 4'b0010; 
    4'b1110 : STM = 4'b0011; 
endcase 

注意,你并没有规定所有的输出对于所有状态,因此你会被暗示的锁存器。意外暗示闩锁被认为是不好的做法,并可能导致难以跟踪时间问题。以及RTL与门电平不匹配。我会建议添加一个默认情况下做一些明智的事情。

always @* begin 
    case({but1,but2,but3,but4}) 
    4'b0101 : STM = 4'b0000; 
    4'b0110 : STM = 4'b0001; 
    4'b1010 : STM = 4'b0010; 
    4'b1110 : STM = 4'b0011; 
    default : STM = 4'b0000; 
    endcase 
end 

注2:你可能想要做一些清理的按钮按下,去弹跳或者至少通过亚稳态触发器推杆。您可能希望添加边沿检测电路,以便每按一次只能获得1个时钟周期的宽脉冲。