如何检查用verilog编写的7段显示的输出

时间:2018-08-08 14:15:09

标签: verilog

我目前是Verilog的新手,想输入一下我的代码是否正确。我已经附上了代码和测试台,但是值没有改变。我该怎么办? 我正在使用quartus工具。 我从以下位置复制了代码: https://www.nandland.com/vhdl/modules/binary-to-7-segment.html

我的代码:

module wow(
input       i_Clk,reset,
input [3:0] i_Binary_Num,
output  reg    o_Segment_A,
output  reg    o_Segment_B,
output  reg    o_Segment_C,
output  reg    o_Segment_D,
output  reg    o_Segment_E,
output  reg    o_Segment_F,
output  reg    o_Segment_G
);
reg [6:0]    r_Hex_Encoding = 7'h00;

// Purpose: Creates a case statement for all possible input binary numbers.
// Drives r_Hex_Encoding appropriately for each input combination.
always @(posedge i_Clk)

begin
  case (i_Binary_Num)
    4'b0000 : r_Hex_Encoding <= 7'h7E;
    4'b0001 : r_Hex_Encoding <= 7'h30;
    4'b0010 : r_Hex_Encoding <= 7'h6D;
    4'b0011 : r_Hex_Encoding <= 7'h79;
    4'b0100 : r_Hex_Encoding <= 7'h33;          
    4'b0101 : r_Hex_Encoding <= 7'h5B;
    4'b0110 : r_Hex_Encoding <= 7'h5F;
    4'b0111 : r_Hex_Encoding <= 7'h70;
    4'b1000 : r_Hex_Encoding <= 7'h7F;
    4'b1001 : r_Hex_Encoding <= 7'h7B;
    4'b1010 : r_Hex_Encoding <= 7'h77;
    4'b1011 : r_Hex_Encoding <= 7'h1F;
    4'b1100 : r_Hex_Encoding <= 7'h4E;
    4'b1101 : r_Hex_Encoding <= 7'h3D;
    4'b1110 : r_Hex_Encoding <= 7'h4F;
    4'b1111 : r_Hex_Encoding <= 7'h47;
  endcase
end
 always @ (posedge i_Clk)
 begin

// r_Hex_Encoding[7] is unused
o_Segment_A <= r_Hex_Encoding[6];
o_Segment_B <= r_Hex_Encoding[5];
o_Segment_C <= r_Hex_Encoding[4];
o_Segment_D <= r_Hex_Encoding[3];
o_Segment_E <= r_Hex_Encoding[2];
o_Segment_F <= r_Hex_Encoding[1];
o_Segment_G <= r_Hex_Encoding[0];
end
endmodule 

和测试平台:

module wow_testbench();
reg i_Clk, reset;
reg [3:0] i_Binary_Num;
wire o_Segment_A,o_Segment_B,o_Segment_C,o_Segment_D,o_Segment_E,o_Segment_F,o_Segment_G;

wow dut(i_Clk,reset,i_Binary_Num,o_Segment_A,o_Segment_B,o_Segment_C,o_Segment_D,o_Segment_E,o_Segment_F,o_Segment_G);
initial begin 
  begin
if(reset)
 i_Binary_Num <= 4'd0;
else
 i_Binary_Num <= i_Binary_Num + 4'd1;
end 
i_Clk=0;
forever #5 i_Clk=~i_Clk;
i_Binary_Num=4'd0;
end
endmodule

感谢您的期待

1 个答案:

答案 0 :(得分:0)

我可以看到您的代码有一些问题。主要问题似乎是您为i_Binary_Num设置了一个计数器,但是它仅在初始循环中执行一次,并且在零时间发生。同样,您有一个i_Binary_Num的重置值,但从未为重置分配任何值,因此,如果查看波形,您会发现i_Binary_Num从零时刻开始等于7'hXX,并且从未改变。

对于测试平台,您确实希望事件发生在时钟沿,但是您可以使用不可综合的行为代码。因此,您无需像在FPGA中实现的真实计数器那样对二进制计数器进行编码。

我还注意到您在测试台中没有正确匹配起始-结束对。这意味着您的永远循环实际上是在初始语句内执行的,但是在所有其他初始语句都发生之后。另外,您确实需要缩进和样式保持一致。缩进没有神奇的价值,但是您应该保持一致-选择2、3或4个空格,并始终使用这种方式,或者至少直到您处于可能存在公司范围编码标准的公司环境中为止。

我没有时间为您实际设置一个模拟项目,但这也许会有所帮助:

module wow_testbench();
    reg       i_Clk = 1'b0;
    reg       reset;
    reg [3:0] i_Binary_Num;
    wire      o_Segment_A, o_Segment_B, o_Segment_C, o_Segment_D, o_Segment_E, o_Segment_F, o_Segment_G;

    wow dut(i_Clk, reset, i_Binary_Num, o_Segment_A, o_Segment_B, o_Segment_C, o_Segment_D, o_Segment_E, o_Segment_F, o_Segment_G);

    initial begin
        // perform a reset
        reset = 1'b0;
        @ (posedge i_Clk);
        reset = 1'b1;
        @ (posedge i_Clk);
        @ (posedge i_Clk);
        reset = 1'b0;

        // loop through numbers from 0 to 9, on positive clock edges
        for (i_Binary_Num = 4'd0; i_Binary_Num < 4'd10; i_Binary_Num = i_Binary_Num + 4'd1) 
            @ (posedge i_Clk);
        $stop;

    end // initial 

    // Create a clock with 10 ns period. 
    // Note that the clock was initialized to 0 when it was declared. 
    forever begin 
        #5 i_Clk = ~i_Clk;
    end // forever loop

endmodule

请注意,测试台不需要看起来像RTL代码,这是行为上的。时钟边沿驱动用于激励DUT的信号断言,而不仅仅是在随机延迟(或完全没有延迟)之后发生。加上使用一致的缩进,可以很容易地遵循代码并检查开始-结束对是否正确匹配。最后,请注意,一旦发送完所有刺激,就会有一个$ stop调用来停止模拟。