【问题标题】:24 Hour Clock code, getting fan out error24 小时制代码,出现扇出错误
【发布时间】:2021-10-14 22:04:42
【问题描述】:
module top_module(
    input clk,
    input reset,
    input ena,
    output pm,
    output reg [7:0] hh,
    output reg [7:0] mm,
    output reg [7:0] ss); 

    wire [4:0] enable;
    
    assign enable[0] = ss[3:0] == 4'd9;
    assign enable[1] = ss[7:0] == 8'h59;
    assign enable[2] = {mm[3:0],ss[7:0]} == 12'h959;
    assign enable[3] = {mm[7:0],ss[7:0]} == 16'h5959;
    assign enable[4] = {hh[3:0],mm[7:0],ss[7:0]} == 20'h95959;

    bcd in1(clk, reset, ena, ss[3:0]);
    bcd in2(clk, reset, enable[0], ss[7:4]);
    bcd in3(clk, reset, enable[1], mm[3:0]);
    bcd in4(clk, reset, enable[2], mm[7:4]);
    bcd in5(clk, reset, enable[3], hh[3:0]);
    bcd in6(clk, reset, enable[4], hh[7:4]);
        
    always @ (*) begin
       if(reset) begin
           pm <= 0;
           hh <= 8'h12;
           ss <= 8'h00;
           mm <= 8'h00;
       end
        else if(ena) begin         
            
         // ss <= ss == 8'h59;
         // mm <= (mm == 8'h59 & ss == 8'h59) ?? 8'h00 : mm;
         // hh <= (hh == 8'h12 & mm == 8'h59 & ss == 8'h59) ?? 8'h01 : hh;
            
        end
    end
   
endmodule

module bcd(input clk, reset, ena,
           output [3:0] q);
    
    always @ (posedge clk) begin
        q <= reset ? 0 : (ena ? (q == 4'd9 ? 0 : q + 1) : q);
    end
        
endmodule

我试图了解为什么当我尝试运行此代码时,会收到此错误:

Error (12014): Net "hh[7]", which fans out to "hh[7]", cannot be assigned more than one value File: /home/h/work/hdlbits.2188345/top_module.v Line: 28
    Error (12015): Net is fed by "GND"
    Error (12015): Net is fed by "bcd:in6|q[3]" File: /home/h/work/hdlbits.2188345/top_module.v Line: 49

我正在为ssmmhh 中的所有其他元素一一了解。我没有看到我是如何尝试在多个地方赋予它一个价值的。非常混乱。

【问题讨论】:

    标签: verilog hdl digital


    【解决方案1】:

    错误消息告诉您,您在 2 个位置分配给 hh[7]。第一行是:

    bcd in6(clk, reset, enable[4], hh[7:4]);
    

    第二行是:

           hh <= 8'h12;
    

    在第一行,hhbcd 模块的q 输出信号驱动。

    解决此问题的一种方法是从top_module 中删除always 块。代码唯一要做的就是在复位期间设置信号,这已经在 bcd 模块中完成了。

    这里是修改后的代码,对我来说编译没有错误:

    module top_module(
        input clk,
        input reset,
        input ena,
        output pm,
        output [7:0] hh,
        output [7:0] mm,
        output [7:0] ss); 
    
        wire [4:0] enable;
        
        assign enable[0] = ss[3:0] == 4'd9;
        assign enable[1] = ss[7:0] == 8'h59;
        assign enable[2] = {mm[3:0],ss[7:0]} == 12'h959;
        assign enable[3] = {mm[7:0],ss[7:0]} == 16'h5959;
        assign enable[4] = {hh[3:0],mm[7:0],ss[7:0]} == 20'h95959;
    
        bcd in1(clk, reset, ena, ss[3:0]);
        bcd in2(clk, reset, enable[0], ss[7:4]);
        bcd in3(clk, reset, enable[1], mm[3:0]);
        bcd in4(clk, reset, enable[2], mm[7:4]);
        bcd in5(clk, reset, enable[3], hh[3:0]);
        bcd in6(clk, reset, enable[4], hh[7:4]);
    endmodule
    
    module bcd(input clk, reset, ena,
               output reg [3:0] q);
        
        always @ (posedge clk) begin
            q <= reset ? 0 : (ena ? (q == 4'd9 ? 0 : q + 1) : q);
        end
        
    endmodule
    

    还请注意,我从hhmmss 端口中删除了reg,并将reg 添加到q 端口。

    【讨论】:

      猜你喜欢
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多