我目前是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
感谢您的期待
答案 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调用来停止模拟。