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