Verilog 模块在为输入赋值时始终采用默认情况

问题描述 投票:0回答:1

我刚刚开始使用 Verilog。我的第一个项目是一个用 16 位输入控制 4 个 7 段显示器的模块。我的

BCDtoSSeg
模块如下:

module BCDtoSSeg (BCD, SSeg);

  input [3:0] BCD;
  output reg [0:6] SSeg;
always @ ( * ) begin
  case (BCD)
   4'b0000: SSeg = 7'b0000001; // "0"  
    4'b0001: SSeg = 7'b1001111; // "1" 
    4'b0010: SSeg = 7'b0010010; // "2" 
    4'b0011: SSeg = 7'b0000110; // "3" 
    4'b0100: SSeg = 7'b1001100; // "4" 
    4'b0101: SSeg = 7'b0100100; // "5" 
    4'b0110: SSeg = 7'b0100000; // "6" 
    4'b0111: SSeg = 7'b0001111; // "7" 
    4'b1000: SSeg = 7'b0000000; // "8"  
    4'b1001: SSeg = 7'b0000100; // "9" 
   4'ha: SSeg = 7'b0001000;  
   4'hb: SSeg = 7'b1100000;
   4'hc: SSeg = 7'b0110001;
   4'hd: SSeg = 7'b1000010;
   4'he: SSeg = 7'b0110000;
   4'hf: SSeg = 7'b0111000;
    default:
    SSeg = 0;
  endcase
end

endmodule

默认情况下 SSeg = 0。我的模块根据 4 位阳极的当前值控制显示

an
如下所示:

`timescale 1ns / 1ps
module display(
    input [15:0] num,
    input clk,
    output [0:6] sseg,
    output reg [3:0] an,
     input rst,
     output led
    );

reg [3:0] bcd = 0;

BCDtoSSeg bcdtosseg(.BCD(bcd), .SSeg(sseg));

reg [26:0] cfreq = 0;
wire enable;

// Divisor de frecuecia

assign enable = cfreq[2];
assign led = enable;
always @(posedge clk) begin
  if(rst==1) begin
        cfreq <= 0;
    end else begin
        cfreq <= cfreq+1;
    end
end

reg [1:0] count = 0;
always @(posedge enable) begin
        if(rst==1) begin
            count <= 0;
            an <= 4'b1111; 
        end else begin 
            count <= count+1;
            case (count) 
                2'h0: begin bcd <= num[3:0];   an <= 4'b1110; end 
                2'h1: begin bcd <= num[7:4];   an <= 4'b1101; end 
                2'h2: begin bcd <= num[11:8];  an <= 4'b1011; end 
                2'h3: begin bcd <= num[15:12]; an <= 4'b0111; end 
            endcase
        end
end

endmodule

问题是,每当我尝试使用测试平台模拟它时,当计数器启动时,

SSeg
的值会直接变为默认值(0)。我尝试将
bcd <= num[#:#]
替换为随机 4 位值,例如
bcd <= b´####
,并且模拟运行良好。
SSeg
的值会随着阳极的值而相应变化,但每当我使用任何包含
num
的表达式时,它都会变为默认值。我如何定义变量或输入可能是一个错误,但老实说我不知道。这是测试台,以防有任何用处:

`timescale 1ns / 1ps

module testbench;

    // Inputs
    reg [15:0] num;
    reg clk2;
    reg rst;

    // Outputs
    wire [0:6] sseg;
    wire [3:0] an;

    // Instantiate the Unit Under Test (UUT)
    display uut (
    //  .num(num), 
        .clk(clk2), 
        .sseg(sseg), 
        .an(an), 
        .rst(rst)
    );

    initial begin
        // Initialize Inputs
        clk2= 0;
        rst = 1;
        #10 rst =0;

        num = 16'h4321;
        
    end
      
    always #1 clk2 = ~clk2;
    
endmodule

非常感谢任何帮助。

verilog fpga quartus intel-fpga questasim
1个回答
0
投票

当我运行仿真并查看

BCDtoSSeg
模块中的波形时,我看到
BCD
输入信号在 17ns 时从 0 转换到
z
,并且在仿真的其余部分中保持该值。由于
z
与 case 语句中的任何一项都不匹配,因此执行 case default,并将
SSeg
赋值为 0。

我使用的模拟器显示了这个编译警告,它确定了问题:

    display uut (
              |
xmelab: *W,CUVWSI : 1 input port was not connected:
xmelab:  num

也许您的模拟会生成类似的消息。查看模拟日志文件等

解决方案是在测试台中驱动

num
输入。变化:

//  .num(num), 

至:

    .num(num), 

修复后,

SSeg
采用其他值。

© www.soinside.com 2019 - 2024. All rights reserved.