我正在参加一个硬件课程,我们应该使用Verilog完成一个庞大的项目,但是我们被告知它与C非常相似。在某种程度上可能是这样,但在其他方面根本没有。例如,我花了几个小时在线查看如何在模块之间传递变量,并且无法弄明白。所以从startMod开始我试图调用dispBinHex来显示在十六进制显示器上Altera板上的sw [3:2]和sw [2:1]开关之间添加的二进制数。但是我不断遇到各种各样的错误,我尝试了许多不同的东西来解决这个问题,但没有运气。最常见的错误是" heierchy无法解决"并使用下面的代码我得到"输出或输出端口' out'必须连接到结构网表达式#34;。我在网上发现了一些关于按名称或位置连接模块的文章,这部分仍然超出了我的范围。我完全不知道如何做基本模块参数传递Verilog并考虑放弃这个类,有人可以解释如何使用模块,因为我们在C中执行功能。以下代码都在一个文件中名为startMod,它必须是Verilog的可综合子集。这就是我所拥有的:
module dispBinHex (select, out);
//Edit: changed input from [3:0] to [1:0]
input [1:0] select;
output reg [6:0] out;
always @(select)
begin
out = 7'b1000000;
case (select)
4'b0000: out = 7'b1000000; // 0
4'b0001: out = 7'b1111001; // 1
4'b0010: out = 7'b0100100; // 2
endcase
end
endmodule
module startMod(
input [9:0] sw,
input [3:0] key,
input clock,
output [9:0] ledr,
output [7:0] ledg,
output reg [6:0] hex
);
integer i;
reg [3:0] switch;
switch = sw[3:2] + sw[2:1];
/*
Edit: I replaced the code below until ***********************
if (sw[0] == 1'b0)
begin
case (switch)
4'b0000:
begin
dispBinHex BH(.select(switch), .out(hex0));
end
4'b0001:
begin
dispBinHex BH(.select(switch), .out(hex0));
end
4'b0010:
begin
dispBinHex BH(.select(switch), .out(hex0));
end
4'b0010:
begin
dispBinHex BH(.select(switch), .out(hex0));
end
endcase
end
***************************************************
*/
// with this code
reg [1:0] switch;
if (sw[0] == 1'b0)
begin
switch = sw[4:3]+sw[2:1];
dispBinHex BH(.select(switch), .out(hex0));
end
endmodule
但我现在得到的错误信息是:
Error (10170): Verilog HDL syntax error at L2C227.v(73) near text "BH"; expecting "<=", or "="
答案 0 :(得分:1)
我建议你阅读Verilog in a day。由于verilog不像C,一些语法是相同的,但语言的工作方式不是。它毕竟是硬件描述语言。
变量不会在模块之间传递,您可以描述物理连接它们的连线。
当你到达Control Statments上的部分时,它们看起来很像C,但它们必须包含在一个块中。你可以:
always @(posedge clk) // Describes a flip-flop behaviour
always @* // Describes combinatorial hardware
您还可以使用initial
对测试平台有用,因为它只在开始时运行一次。
从此您应该看到您不能拥有浮动的case
或if
语句。目前,您的if (sw[0] == 1'b0)
未包含在块中。
答案 1 :(得分:0)
首先,Verilog是硬件描述语言。它是不一种编程语言,如C. Verilog实现更像是在电路分析中学习的模拟电路,而不是编程语言。
我认为你不能在没有总是块的情况下使用case语句。此外,模块startMod中的case语句是冗余的,因为信号正在通过传递给它们的模块中的case语句进行过滤。
您正在添加两个2位信号,但您的开关是4位!而且我更愿意将开关作为电线而不是注册。
你的KEY,LEDG,LEDR,CLOCK在做什么?
至于你原来的问题,你正在以正确的方式向dispBinHex模块传递信号!只做一次,而不是那么多次。模块是数字电路实现的块,不 C / C ++函数。在实例化模块时,就像将电线连接到该电路块一样。它们只是联系。因此你的hex0应该是一个简单的输出而不是输出reg。