在verilog HDL中,我的语句显示为XXXXX而不是默认值。

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

编辑:我忘了加一个i =i+1,代码工作了,但对于0值还是不行,这就是我现在要解决的问题。

我试图模拟一个3位数的7段LED阵列,所以我正在接受一个常量输入(在这种情况下,1,2,3......),这是二进制的,并把它变成二进制编码的十进制,然后把它放在7段的模块中来显示数字。

我的代码一直显示XXXXXX,而不是11111111,而11111111应该作为默认情况下的语句显示。如果有人知道可能是什么原因,请告诉我。

下面是我用来显示结果的代码。

module m_top();

 reg clk =0;
reg[7:0] eight_bit_value;
wire[3:0] r_in;//ones
wire[3:0] r2_in;//tens
wire[3:0] r3_in;//hundreds
wire [6:0] w_led;
wire [6:0] w2_led;
wire [6:0] w3_led;


integer i;
always#5 clk=~clk;//clock 
initial $display ("        gfedcba  gfedcba");
double_dabble segmentbits(clk,eight_bit_value,r_in,r2_in,r3_in);

initial begin
  eight_bit_value<= 8'd0; i = 0;
  #1 $display("%3d -> %b %b %b %b", i,eight_bit_value, w_led,w2_led,w3_led);
  for(i = 1; i <= 99; i = i + 1) begin
    #1000 eight_bit_value <= eight_bit_value + 1;
    #1000 $display("%3d ->%b %b %b %b", i, eight_bit_value,w_led,w2_led,w3_led);
  end
end

 //double_dabble segmentbits(clk,eight_bit_value,r_in,r2_in,r3_in); 
 m_7segled m_7segled1(r_in, w_led);
 m_7segled m_7segled2(r2_in,w2_led);
 m_7segled m_7segled3(r3_in,w3_led);

这是我在代码中使用的2个函数。

module double_dabble(input clk,
             input  [7:0] original_value, 
             output reg[3:0] ones,
             output reg[3:0] tens,
             output reg[3:0] hundreds);




 reg[3:0] i=0;
  reg[19:0] shift_register =0;

  reg[3:0] temp_ones=0;
  reg[3:0] temp_tens=0;
  reg[3:0] temp_hundreds=0;

  reg[7:0]temp_original_value=0;




 always@(posedge clk)
    begin//as long as value doesnt change)
        if(i==0&(temp_original_value !=original_value))
        begin
        shift_register = 20'd0;
        temp_original_value = original_value;

        //setting up the register to be shifted 
        temp_hundreds = shift_register[19:16];
        temp_tens =shift_register[15:12];
        temp_ones=shift_register[11:8];
        shift_register[7:0] = original_value;
        i=i+1;// I FORGOT TO ADD THIS , NOW I DID AND IT WORKS FOR >0 but not for 0;
         end
        if(i>0 & i<9)
        begin
        //check if they are greater than 5 if so add 3
        if(temp_hundreds>=5) temp_hundreds=temp_hundreds+3;
        if(temp_tens>=5) temp_tens=temp_tens+3;
        if(temp_ones>=5) temp_ones=temp_ones+3;

        shift_register[19:8] = {temp_hundreds,temp_tens,temp_ones};

        shift_register= shift_register<<1;

        temp_hundreds = shift_register[19:16];
        temp_tens =shift_register[15:12];
        temp_ones=shift_register[11:8];
        i=i+1;
        end
         if(i==9)
           begin
           i=0;

           hundreds = temp_hundreds;
           tens=temp_tens;
           ones=temp_ones;
           end
        end
endmodule

七段模块是这样的。

module m_7segled (w_in,r_led);

    input wire [3:0] w_in;
    output reg [6:0] r_led;

    always@(*) begin
        case (w_in%10)
            4'd0 : r_led <= 7'b1000000;
            4'd1 : r_led <= 7'b1111001;
            4'd2 : r_led <= 7'b0100100;
            4'd3 : r_led <= 7'b0110000;
            4'd4 : r_led <= 7'b0011001;
            4'd5 : r_led <= 7'b0010010;
            4'd6 : r_led <= 7'b0000010;
            4'd7 : r_led <= 7'b1011000;
            4'd8 : r_led <= 7'b0000000;
            4'd9 : r_led <= 7'b0010000;
            default : r_led <= 7'b1111111;
        endcase
    end
endmodule
verilog fpga hdl iverilog
1个回答
4
投票

你的程序充满了verilog和编程错误。我发现的错误很少。

  1. 操作符 & 不等于操作者 && 的if语句中。它的工作方式不同,优先顺序也不同。所以,你的 if 语句在任何情况下都不能正常工作。你用了 & 在所有条件语句中。

  2. 在你的语句中 i>0 & i<9 应该是这样 i >= 0 && i < 9失踪 >= 造成你 x 问题(结合#1)。

  3. 你错用了 blocking 的顺序逻辑中的作业。double_dabble. 其中一些应该是 non-blocking.

  4. 你错误地使用了变量初始化。这在模拟和一些FPGA中可能有效,但在现实世界中不起作用。你需要重置。

  5. 您不正确地使用了 non-blocking 赋值的组合逻辑 m_7segled 他们都应该 blocking.

回答评论。关于 reg 初始化。

使用诸如 reg[3:0] i=0; 虽然在verilog中是合法的,但它会给你带来合成问题。它们可以在一些FPGA或仿真系统中正确合成,但不会被原理图合成工具合成。所以,在一般情况下,你应该使用一个复位信号,用复位来初始化这些变量,类似于下面的东西。

always @(posedge clk) begin
    if (reset)
       i <= 0;
    else 
       i <= i + 1;
end
© www.soinside.com 2019 - 2024. All rights reserved.