Verilog寄存器输出

Verilog寄存器输出,verilog,intel-fpga,Verilog,Intel Fpga,我正在使用Altera DE2开发板,我想在交换机上读取输入。这存储在寄存器中。根据计数器,这些寄存器递增。然后,通过B2D转换器将寄存器输出到七段显示器。但我不能将寄存器传递给函数 wire [26:0] Q,Q2,Q3,Q4; wire [3:0] one,two,three,four; reg SecInc,MinInc,HrInc; reg [3:0] M1,M2,H1,H2; assign one = SW[3:0]; assign two = SW[7:4]; assign thr

我正在使用Altera DE2开发板,我想在交换机上读取输入。这存储在寄存器中。根据计数器,这些寄存器递增。然后,通过B2D转换器将寄存器输出到七段显示器。但我不能将寄存器传递给函数

wire [26:0] Q,Q2,Q3,Q4;
wire [3:0] one,two,three,four;
reg SecInc,MinInc,HrInc;
reg [3:0] M1,M2,H1,H2;

assign one = SW[3:0];
assign two = SW[7:4];
assign three = SW[11:8];
assign four = SW[15:12];

always begin
    M1 = SW[3:0];
    M2 = SW[7:4];
    H1 = SW[11:8];
    H2 = SW[15:12];
end
这就是我获取和存储输入的方式。它们来自开关,我们用它作为小时和分钟的二进制表示。 根据计数器,我们增加一分钟或一小时的寄存器

    //increment seconds from 0 to 60
counter seconds (SecInc,KEY[0],Q2);
defparam seconds.n = 8;
defparam seconds.mod = 60;

    always @ (negedge CLOCK_50) begin
      if (Q2 >= 60) begin
        MinInc = 1;
        M1 <= M1 + 1'b1;
        if(M1 >= 9) begin
          M1 <= 0;
          M2 <= M2 + 1'b1;
        end
        end else begin
          MinInc = 0;
        end
      end
问题就在这里。这在verilog中是不允许的。我需要一种方法将我的寄存器发送到一个函数,该函数使用一些B2D转换显示从0到9的数字

我要说的是,我以前从未正式介绍过verilog,我已经尽了我所能。我甚至试着制作一个新的模块,在这个模块中,我将通过1,2,3,4,并让模块增加它们,就像我展示的计数器的Q2一样。非常感谢您的任何建议或帮助

根据要求,这里是十六进制模块:

    module hex(BIN, SSD);
    input [15:0] BIN;
    output reg [0:6] SSD;

    always begin
      case(BIN)
        0:SSD=7'b0000001;
        1:SSD=7'b1001111;
        2:SSD=7'b0010010;
        3:SSD=7'b0000110;
        4:SSD=7'b1001100;
        5:SSD=7'b0100100;
        6:SSD=7'b0100000;
        7:SSD=7'b0001111;
        8:SSD=7'b0000000;
        9:SSD=7'b0001100;
      endcase
    end
  endmodule

提前谢谢你

您的
hex
模块不是一个函数,它是一个模块,因此必须使用如下实例名称实例化:

hex digit0(.BIN(M1), .SSD(HEX4));
hex digit1(.BIN(M2), .SSD(HEX5));
hex digit2(.BIN(H1), .SSD(HEX6));
hex digit3(.BIN(H2), .SSD(HEX7));

除了nguthrie是正确的,您需要将十六进制转换器实例化为一个模块之外,您还可以从always块中的竞态条件驱动
M1
。非阻塞分配将在块内同时计算(或基本上同时计算)。这不是一个按顺序发生事情的程序。更好的办法是:

always @ (negedge CLOCK_50) begin
if (Q2 >= 60) begin
    MinInc = 1;
    if (M1 < 9) begin
        M1 <= M1 + 1'b1;
    end else begin
      M1 <= 0;
      M2 <= M2 + 1'b1;
    end
    end else begin
      MinInc = 0;
    end
end
始终@(负边缘时钟_50)开始
如果(Q2>=60)开始
MinInc=1;
如果(M1<9)开始

M1您能展示“十六进制”函数的实现吗?@alex.forencich十六进制模块已经包含在内。模块本身是否可以接受参数的寄存器?在实例化模块时,您需要给出模块名称。尝试十六进制hex4(M1,hex4)@alex.forencich这样做,我得到了一个错误“error”(10031):净“M1[0]”在第3部分。v(22)已经由输入端口“SW[0]”驱动,并且不能由另一个信号驱动“这是为M1[2]M1[3]和M1[4]给定的”,所有M'sI都会将
output reg[0:6]SSD
更改为
output reg[6:0]SSD
在模块hex中。我也尝试了这一点,我得到了与上面发布的相同的错误,M1[n]已经由输入端口驱动,不能驱动两次。
always @ (negedge CLOCK_50) begin
if (Q2 >= 60) begin
    MinInc = 1;
    if (M1 < 9) begin
        M1 <= M1 + 1'b1;
    end else begin
      M1 <= 0;
      M2 <= M2 + 1'b1;
    end
    end else begin
      MinInc = 0;
    end
end