2013-12-17 2 views
1

저는 7 세그먼트 디코더에 연결될 Verilog를 사용하여 BCD 카운터를 만들려고합니다. ?

Multi-source in Unit <BCDcountmod> on signal <BCD0<3>>; this signal is connected to multiple drivers.> ** 그리고 더 .....

*** 모든 솔루션 *
Verilog 복수 드라이버

module BCDcountmod(
    input Clock, Clear, up, down, 
    output [3:0] BCD1_1, BCD0_0); 
reg [3:0] BCD1, BCD0; 
//reg [3:0] BCD1_1, BCD0_0; 
always @(posedge Clock) begin 
    if (Clear) begin 
    BCD1 <= 0; 
    BCD0 <= 0; 
    end 
end 


always @(posedge up) begin 
     if (BCD0 == 4'b1001) begin 
     BCD0 <= 0; 
     if (BCD1 == 4'b1001) 
      BCD1 <= 0; 
     else 
      BCD1 <= BCD1 + 1; 
     end 
     else 
     BCD0 <= BCD0 + 1; 
    end 


always @(posedge down) begin 
     if (BCD0 == 4'b0000) begin 
     BCD0 <= 4'b1001; 
     if (BCD1 == 4'b1001) 
      BCD1 <= 4'b1001; 
     else 
      BCD1 <= BCD1 - 1; 
     end 
     else 
     BCD0 <= BCD0 - 1; 
    end 

assign BCD1_1 = BCD1; 
assign BCD0_0 = BCD0; 

endmodule 
+0

다음과 같은 복사본이 생성됩니다. http://electronics.stackexchange.com/questions/93932/connected-to-multiple-drivers-problem-verilog – Greg

답변

0

것은 단지의 당신은이 블록이 대답 mcleod_ideafix에 추가 : 의미

always @(posedge Clock) begin 
    if (Clear) begin 
    BCD1 <= 0; 
    BCD0 <= 0; 
    end 
end 

을 동기 그와 같이 일반적으로 비동기있을 것입니다 당신의 의도 경우 분명히, 나는 확실하지 않다 ASIC 설계에서 플립 플롭을 없애거나 FPGA의 초기 상태를 설정하십시오. 와 플립 플롭에 대한

비동기 액티브 하이 명확

always @(posedge clock or posedge clear) begin 
    if (clear) begin 
    BCD1 <= 'b0; //NB: defined widths 
    BCD0 <= 'b0; 
    end 
    else 
    // normal logic 
    end 
end 

는 액티브 로우 리셋 사용하는 것이 더 일반적이다 == 1'b1 당신이 얻을 것이다 의미와

always @(posedge clock or negedge clear_n) begin 
    if (~clear_n) begin 
    BCD1 <= 'b0; //NB: defined widths 
    BCD0 <= 'b0; 
    end 
    else 
    if (up == 1'b1) begin 
     // up logic 
    end 
    else if (down == 1'b1) begin 
     // down logic 
    end 
    else begin 
     // nothing to see here 
    end 
    end 
end 

이렇게 비교를 LHS (왼손 쪽)가 1 비트보다 넓은 경우 이상한 동작 대신 폭 불일치 경고가 표시됩니다.

output reg [3:0] BCD1, BCD0 

내가 훨씬 명확 다음 찾을 있지만 :

output reg [3:0] BCD1, 
output reg [3:0] BCD0 
당신은 단지 출력으로 등록 년대가 다음을 수행하는 데 필요한

output [3:0] BCD1_1, BCD0_0); 
reg [3:0] BCD1, BCD0; 
assign BCD1_1 = BCD1; 
assign BCD0_0 = BCD0; 

:

은 또한 당신이 가지고있는 것으로 나타났습니다

+1

SO의 BCD1 다운 카운터에도 버그가 있습니다. if (BCD1 == 4'b1001) BCD1 <= 4'b1001;은 if (BCD1 == 4'b0000) BCD1 <= 4'b1001;이어야한다. – Greg

4
( 여기 다음 내 코드입니다) :
내가 그것을 합성 한 후, 오류는 다음과 같이 발생

다른 always 블록에서 BCD을 수정할 수 없습니다. 수정은 하나만 always에서 수행해야합니다. 뭔가 같은 :

module BCDcountmod(
    input Clock, Clear, up, down, 
    output [3:0] BCD1_1, BCD0_0); 
    reg [3:0] BCD1, BCD0; 
//reg [3:0] BCD1_1, BCD0_0; 

    assign BCD1_1 = BCD1; 
    assign BCD0_0 = BCD0; 

    always @(posedge Clock) begin 
    //---- IS IT CLEAR? -------------- 
    if (Clear) begin 
     BCD1 <= 0; 
     BCD0 <= 0; 
    end 
    //---- IS IT UP? -------------- 
    else if (up) then begin 
     if (BCD0 == 4'b1001) begin 
     BCD0 <= 0; 
     if (BCD1 == 4'b1001) 
      BCD1 <= 0; 
     else 
      BCD1 <= BCD1 + 1; 
     end 
    end 
    //---- IS IT DOWN? -------------- 
    else if (down) begin 
     if (BCD0 == 4'b0000) begin 
     BCD0 <= 4'b1001; 
     if (BCD1 == 4'b1001) 
      BCD1 <= 4'b1001; 
     else 
      BCD1 <= BCD1 - 1; 
     end 
     else 
     BCD0 <= BCD0 - 1; 
    end 
    end 
endmodule