我正在尝试从物理开关接收4个输入,并根据它们的状态发送出2个引脚,我已经在我的CPLD上打开了1或0.我完全失去了如何做到这一点..... .....这是我到目前为止所拥有的。有什么想法吗?
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 :(得分: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
现在变得更容易变成案例陈述:
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个时钟周期的宽脉冲。
答案 1 :(得分:1)
只需修改
always @(but1 || but2 || but3 || but4) begin
到
always @(but1, but2, but3, but4) begin
它会起作用: - )
always @(but1 || but2 || but3 || but4)
并不意味着"当but1 .. but4中的任何一个改变" 而是"当获得的信号时逻辑ORing but1 .. but4更改"
if..else阶梯中的另一个问题:您需要指定else
条件。如果没有明确的其他情况,当if..elseif案例中提到的条件都不存在时,模拟器将不知道驱动STM的内容;在这种情况下,它通常会尝试保留STM的先前值。这可能不是您希望代码执行的操作。另一个问题是,由于STM在模拟开始时没有分配任何值,你可能会在很长一段时间内看到X.