【问题标题】:7 Segment Display multiple conditions verilog7段显示多个条件verilog
【发布时间】:2015-11-12 02:02:51
【问题描述】:

我知道这个问题听起来很奇怪而且含糊不清,但我在使用 Verilog 时遇到了问题。 我有一个 FSM,它必须使用 4 个 7 段显示器,在一种状态下它应该在一个显示器上只显示一个数字,在另一种状态下它应该使用所有 4 个显示器来显示一个字符串。 我的问题是我如何才能真正解决这种问题的 always@ 块。 我尝试在 If else 块中设置一个 always@ 两个不同的情况,但没有成功。还尝试制作两个模块,一个用于数字,另一个用于字符串,分配不同的输出端口,但问题是它必须指向相同的硬件端口,并且在比特流上失败。

有人能给我一些建议吗?

好的,我会发布一些代码,但主要是我有一个主状态机,然后我有另一个状态机。根据其他 FSM 的状态,我在显示屏上输出状态编号。但在主状态机的不同状态下,我必须在 4 个 7 段显示器上显示一条消息。我现在得到的是: 这里我使用 CLK 来发送消息

always@(BIN_IN or CLK) begin
if(FAIL==1) begin
     case(state)
           left:
           begin
               HEX_OUT [6:0] <= F;
               SEG_SELECT_OUT <= 4'b0111;
               state <= midleft;
           end
           midleft:
           begin
               HEX_OUT [6:0] <= A;
               SEG_SELECT_OUT <= 4'b1011;
               state <= midright;
           end
//same for the rest
end
else begin  
case (BIN_IN)
4'h0 : begin
    HEX_OUT [6:0] <= 7'b1000000;
    SEG_SELECT_OUT <= 4'b0111;
end
//same logic for the other cases

使用的板子是 Xilinx Basys 3 使用 vivado 综合工具

谢谢

【问题讨论】:

  • 四个7段共享同一条数据线?如果不是,一个简单的 if else 语句就可以解决问题。
  • 查看您正在使用的代码或您正在合成的电路板会很有帮助,因为可能的解决方案会因依赖这些因素的某些因素而异。
  • 您正在用always@(BIN_IN or CLK) 推断组合逻辑,而 RTL 行为将与合成门不匹配。至少,您需要将其更改为 always@(posedge CLK) 以使其同步。

标签: verilog hardware xilinx hdl


【解决方案1】:

正如格雷格所说:

always@(BIN_IN or CLK)

推断组合逻辑。仅使用组合逻辑无法创建 FSM。如您所知,FSM 需要能够存储每个时钟之间的状态。

always@(posedge CLK)

在您的设计中推断人字拖。也就是说,您在这个 always 循环中执行的操作将被存储到下一个上升沿。如果你把所有的设计都放在这个 always 块中,你最终会得到一个典型的摩尔机器,你的输出只会在每个正时钟沿更新。

有点难以理解您试图从您的 code-sn-p 创建什么。您在谈论两个 FSM,但在我看来,您正在尝试进行一项组合操作和一项时钟操作。如果您希望您的设计更新一些输出 - 例如 BIN_IN - 组合(即立即)您必须在 always@(posedge CLK) 块之外执行这些分配。使用always@(posedge CLK) 块来更新您的 FSM 值,然后使用组合 always@(BIN_IN or FAIL) 块来推断将在您的 FSM 输出和其他输出之间进行选择的多路复用器。这样的事情可能会奏效:

always@(posedge CLK)
  begin
    case(state)
    left:
    begin
      FAIL_HEX_OUT <= "A";
      FAIL_SEG_OUT <= 4'b1011;
      state <= midleft;
    end
    //Rest of statements
    endcase
  end

always@(FAIL or BIN_IN or FAIL_SEG_OUT or FAIL_HEX_OUT)
  begin
    if(FAIL == 1) begin
      HEX_OUT <= FAIL_HEX_OUT;
      SEG_SELECT_OUT <= FAIL_SEG_OUT;
    end else begin
      case(BIN_IN)
        //your statements
      endcase
   end
 end

另外,这不起作用:

HEX_OUT [6:0] = A;

这样做可以将 ascii 分配给 reg

HEX_OUT [6:0] = "A";

我还假设您正在使用 endcase 来结束您的案例陈述。 我在这里编译了你的代码-sn-p: http://www.edaplayground.com/x/P_v

编辑: 我更改了组合逻辑上的敏感度列表。上面的代码之前不会工作。

因为您发布的代码太少,所以很难弄清楚您的实际问题是什么。我假设您只有一个输出端口来控制所有 7 段显示器。在这种情况下,当您希望输出 FAIL 时,您需要循环遍历每个 SEG_SELECT_OUT 并为每个显示设置 HEX_OUT。反过来,这意味着每个显示器还能够存储它接收到的HEX_OUT 信号,并且您的输出(可能是SEG_SELECT_OUT)必须启用这些显示寄存器的写入功能。检查是否是这种情况。我还假设您的 30 秒实时计数器在完成时设置 FAIL 标志,并在每次迷宫时重置(我不知道你说迷宫是什么意思) 完成了。您说您需要更改数字,我假设您正在谈论在显示器上输出 BIN_IN 中的数字,并且 BIN_IN 在其他地方被更改。所有这些都应该在上面的代码中起作用。

如果没有更多信息,很难提供任何进一步的帮助。

【讨论】:

  • 感谢您的回答。整个项目由一个顶层模块和到顶层的6个子模块组成。所以一切都是嵌套的,现在看起来很复杂。所以我有一个主状态机和一个迷宫机。当我进入让我说主人的状态 3 时,我去迷宫机器,然后我必须完成它并将完成的结果传递给主人。此外,我必须计算 30 秒,我必须在其中完成迷宫,如果我不能,我必须显示消息。
  • 我真的不知道这在 7segment 模块中是如何工作的,因为在一种情况下它必须更改数字,而在另一种情况下它必须使用所有段来显示一条消息
  • 问题解决了吗?如果没有,我强烈建议您提供更多代码。
  • 嗯,我的意思是提示如何使它工作,我的意思是人们遇到同样问题时通常会采取的一些方法。无论如何,我确实设法纠正了它。问题出在 FAIL 标志上。这是因为我使用了相同的 if-else 块来设置和重置它。当我仅将其更改为将其设置在一个位置并将其重置为完全独立的位置时,它运行良好。还是谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2012-03-10
  • 2018-02-05
  • 2019-05-28
  • 1970-01-01
相关资源
最近更新 更多