【问题标题】:modelsim programming 60 counter (error loading design)modelsim编程60计数器(错误加载设计)
【发布时间】:2017-05-21 15:52:47
【问题描述】:

我的代码编译得很好,但是当我模拟它时它不起作用。 它显示“错误加载设计”。 我认为这些模块中的输入和输出端口是错误的。 但我找不到他们.. 请帮助我的代码中的错误。

module tb_modulo_60_binary;

  reg t_clk, reset;
  wire [7:0] t_Y;
  parameter sec = 30;

  always #(sec) t_clk = ~t_clk;
  modulo_60_binary M1 (t_Y, t_clk, reset);

  initial begin 
    t_clk = 1; reset =1; #10;
    reset = 0; #3050;
    $finish;
  end
endmodule

module modulo_60_binary(y, clk, reset);
  output [7:0] y;
  input reset, clk;
  wire TA1, TA2, TA3, JA2, JA4;
  reg [7:0] y; 

  assign TA1 = 1;
  assign TA2 = (~y[6]) && y[4];
  assign TA3 = (y[5] && y[4]) || (y[6] && y[4]);
  assign JA2 = ~y[3];
  assign JA4 = y[1]&&y[2]; 

  jk_flip_flop JK1 (1, 1, clk, y[0]);
  jk_flip_flop JK2 (JA2, 1, y[0], y[1]);
  jk_flip_flop JK3 (1, 1, y[1], y[2]);
  jk_flip_flop JK4 (JA4, 1, y[1], y[3]);
  t_flip_flop T1 (TA1, clk, y[4]);
  t_flip_flop T2 (TA2, clk, y[5]);
  t_flip_flip T3 (TA3, clk, y[6]);  
  always @(negedge clk)
  begin
    if(reset)
      y <= 8'b00000000;
    else if(y == 8'b01110011)
      y <= 8'b00000000;
  end
endmodule

module t_flip_flop(t, clk, q);
  input t, clk;
  output q;
  reg q;

  initial q=0;
  always @(negedge clk)
  begin
    if(t == 0) q <= q;
    else q <= ~q;
  end

endmodule

module jk_flip_flop(j, k, clk, Q);
  output Q;
  input j, k, clk;
  reg Q;

  always @(negedge clk)
      if({j,k} == 2'b00)  Q <= Q; 
      else if({j,k} == 2'b01)  Q <= 1'b0;
      else if({j,k} == 2'b10)  Q <= 1'b1;
      else if({j,k} == 2'b11)  Q <= ~Q;
endmodule

【问题讨论】:

  • y的每一位必须有一个驱动;你有两个(一个模块实例和一个单独的 always​ 块)。此外,模块实例的输出应连接到网络类型(即wire)。你需要重新思考你的休息逻辑
  • 你能告诉我更多细节吗?应该改变哪一部分?我是第一次用verilog...

标签: verilog counter modelsim


【解决方案1】:

modulo_60_binary 中的 y 信号在两个地方被驱动:

  • 按位 JK# 和 T# 实例
  • y的所有位分配为零的复位逻辑

触发器和组合逻辑必须有一个明确的驱动程序。这是软件和硬件语言之间的根本区别之一。

我的其余答案假设使用 JK 和 T 触发器是设计要求。因此,您需要删除将 y 分配为零的 always 块,并将 y 设为 wire 类型。

将逻辑固定到 T 触发器很容易。只需添加一个条件语句。示例:

wire do_rst = reset || (y == 8'b01110011);
assign TA1 = do_rst ? y[4] : 1;
assign TA2 = do_rst ? y[5] : (~y[6]) && y[4];
assign TA3 = do_rst ? y[6] : (y[5] && y[4]) || (y[6] && y[4]);

JK 触发器更难,因为一个触发器的输出是另一个触发器的时钟。我建议每个 JK 触发器的时钟输入应该是clk,否则当它的 y 位不是 2 减一值的幂(例如 1、3、7、15)时,您会要求复位设计令人头疼.这意味着您需要重新评估您的 JA# 逻辑并添加 KA# 逻辑(提示上面的 do_rst 会有所帮助)。除此之外,我不会为你做这些工作。

有异步重置方法的选项,但对于这个设计,我会建议年龄歧视它。对于y == 特定值的条件复位,硅上的复位脉冲可能太短,这可能导致不可靠的部分复位。您可以添加综合约束/规则以保持足够宽的推动力,但这只是修补脆弱的设计。最好在一开始就设计它健壮。

仅供参考:y[7] 没有驱动程序,实例 T3 的模块声明有错字。

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多