【问题标题】:Increment and Decrement using verilog codes in quartus在 quartus 中使用 verilog 代码进行递增和递减
【发布时间】:2014-08-18 14:58:40
【问题描述】:

我的项目是设计一个verilog代码,在7段(HEX0,HEX1,HEX2,HEX3)上提供输出,并且当在板上1按下按钮KEY0时输出必须增加1,当按钮KEY1时输出必须减少使用 Altera 板 (Cyclone II-EP2C35F672) 按下。

我实现将 1 增加 1,但是当我尝试使用相同的逻辑减少时,我会采用不相关的输出。有没有可能给我一个解决问题的方法。

我的verilog代码是:


module sevensegment (KEY,HEX0,HEX1,HEX2,HEX3);

  input [3:0]KEY;

  output [0:6]HEX0;
  output [0:6]HEX1;
  output [0:6]HEX2;
  output [0:6]HEX3;

  counter D1(~KEY,HEX0,HEX1,HEX2,HEX3);

endmodule

module counter(in,out,out1,out2,out3);
  input  [3:0]in;
  output [6:0]out;
  output [6:0]out1;
  output [6:0]out2;
  output [6:0]out3;
  reg[15:0] tmp;

  always @(posedge in)
  begin
    if(~in[0])
    begin
      tmp <= tmp + 1'b1;
    end
    else if(~in[1])
    begin
      tmp <= tmp - 1'b1;
    end
   end

   displaysevensegment first_digit(tmp[3:0],out);
   displaysevensegment second_digit(tmp[7:4],out1);
   displaysevensegment third_digit(tmp[11:8],out2);
   displaysevensegment fourth_digit(tmp[15:12],out3);
endmodule

module displaysevensegment(in,out);
//                   abcdefg
parameter BLANK    = 7'b1111111;
parameter ZERO     = 7'b0000001; 
parameter ONE      = 7'b1001111;
parameter TWO      = 7'b0010010; 
parameter THREE    = 7'b0000110; 
parameter FOUR     = 7'b1001100; 
parameter FIVE     = 7'b0100100; 
parameter SIX      = 7'b0100000; 
parameter SEVEN    = 7'b0001111;
parameter EIGHT    = 7'b0000000; 
parameter NINE     = 7'b0000100; 
parameter TEN      = 7'b0001000; 
parameter ELEVEN   = 7'b1100000; 
parameter TWELVE   = 7'b0110001; 
parameter THIRTEEN = 7'b1000010; 
parameter FOURTEEN = 7'b0110000; 
parameter FIFTEEN  = 7'b0111000; 

input [3:0]in;
output [6:0]out;

assign out = (in == 0)  ? ZERO: 
             (in == 1)  ? ONE:
             (in == 2)  ? TWO:
             (in == 3)  ? THREE:
             (in == 4)  ? FOUR:
             (in == 5)  ? FIVE:
             (in == 6)  ? SIX: 
             (in == 7)  ? SEVEN:
             (in == 8)  ? EIGHT:
             (in == 9)  ? NINE:
             (in == 10) ? TEN:
             (in == 11) ? ELEVEN:
             (in == 12) ? TWELVE:
             (in == 13) ? THIRTEEN:
             (in == 14) ? FOURTEEN:
             (in == 15) ? FIFTEEN:BLANK;


endmodule

【问题讨论】:

  • “不相关的输出”是什么意思?

标签: verilog microprocessors intel-fpga


【解决方案1】:

当敏感度列表描述为posedge in 时,模拟将无法识别in[1] 的上升沿。只有 LSB 将被监控。而是使用按位运算来检测何时按下某个键并将其用作时钟信号。

wire gen_clk = |in; // bitwise OR
always @(posedge gen_clk) begin
  if (in[0]) tmp <= tmp + 1'b1;
  else if (in[1) tmp <= tmp - 1'b1;
end

wire gen_clk = &in; // bitwise AND
always @(posedge gen_clk) begin
  if (in[0]) tmp <= tmp + 1'b1;
  else if (in[1) tmp <= tmp - 1'b1;
end

旁注:深层嵌套的多路复用器通常会导致性能较低,然后是 case 语句。这是因为大多数合成器不会优化内联多路复用器 (?:)。建议使用 case 语句重新编码 displaysevensegment

input [3:0] in;
output [6:0] out;
reg [6:0] out; // out needs to be a reg

always @* begin
  case(in)
    4'h0 : out = ZERO;
    4'h1 : out = ONE;
    // ...
    4'hE : out = FOURTEEN;
    4'hF : out = FIFTEEN;
    default: out = BLANK;
  endcase
end

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 2011-05-09
    • 2020-12-31
    相关资源
    最近更新 更多