如何在verilog中的模块之间传递值?

时间:2014-10-25 23:57:47

标签: function module verilog

我正在参加一个硬件课程,我们应该使用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 "="

2 个答案:

答案 0 :(得分:1)

我建议你阅读Verilog in a day。由于verilog不像C,一些语法是相同的,但语言的工作方式不是。它毕竟是硬件描述语言。

变量不会在模块之间传递,您可以描述物理连接它们的连线。

当你到达Control Statments上的部分时,它们看起来很像C,但它们必须包含在一个块中。你可以:

always @(posedge clk) // Describes a flip-flop behaviour
always @*             // Describes combinatorial hardware

您还可以使用initial对测试平台有用,因为它只在开始时运行一次。

从此您应该看到您不能拥有浮动的caseif语句。目前,您的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。