繁体   English   中英

在quartus中使用verilog代码进行增减

[英]Increment and Decrement using verilog codes in quartus

我的项目是设计一个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

当灵敏度列表描述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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM