模型IM编程60计数器(错误加载设计)



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

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

您在modulo_60_binary中的y信号在两个位置被驱动:

  • 按位 JK# 和 T# 实例
  • 将所有
  • y位分配给零的重置逻辑

翻牌和梳理逻辑必须有一个明确的驱动因素。这是软件语言和硬件语言之间的根本区别之一。

假设使用 JK 和 T 翻牌是设计要求,我的其余答案。因此,您需要删除将y分配给零的始终块,并将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 位不是两个减一值的幂(例如 1,3,7,15)时,您会要求重置的设计头痛。这意味着您需要重新评估 JA# 逻辑并添加 KA# 逻辑(提示上面的do_rst会有所帮助)。除此之外,我不会为你做这项工作。

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

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

最新更新