【发布时间】:2013-11-18 23:59:06
【问题描述】:
我正在使用 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
我们想在 SSD 上显示结果。
hex(M1,HEX4);
hex(M2,HEX5);
hex(H1,HEX6);
hex(H2,HEX7);
问题就在这里。这在verilog中是不允许的。我需要一种方法将我的寄存器发送到一个函数,该函数使用一些 B2D 转换显示从 0 到 9 的数字。
我会说我以前从未对 verilog 进行过正式介绍,并且我已经尝试了所有我能想到的方法。我什至尝试制作一个新模块,在其中我将传递一、二、三、四并让模块增加它们,就像我展示的计数器的 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'函数的实现吗?
-
@alex.forencich 已包含十六进制模块。模块本身可以接受参数的寄存器吗?
-
您需要在实例化模块时为其指定名称。试试十六进制 hex4(M1,HEX4);
-
@alex.forencich 这样做我得到一个错误“错误(10031):part3.v(22)处的网络“M1 [0]”已经由输入端口“SW [0]”驱动,并且不能由另一个信号驱动“这是为 M1[2] M1[3] 和 M1[4] 给出的,它发生在所有 M 上
-
我会在十六进制模块中将
output reg [0:6] SSD更改为output reg [6:0] SSD。
标签: verilog intel-fpga