2017-04-10 12 views
0

main.vsignal.v의 두 모듈이 있습니다.신호를 외부 모듈로 이동하는 중에 오류가 발생했습니다

main.v에는 16 비트 reg tx를 구형파에 해당하는 값으로 업데이트하는 몇 줄의 코드가 있습니다.

reg [1:0] counter; 
    reg [15:0] tx; 
    always @(posedge clk) begin 
     counter = counter + 1; 
     if (counter[1] == 1) begin 
     tx[15:0] <= 16'b1010101010101010; 
     else 
     tx[15:0] <= 16'b0000000000000000; 
    end 

이 작동합니다. 결국,이 신호를 다른 파일 signal.v으로 옮기고 싶습니다. 왜냐하면 tx에 전달하는 신호가 꾸준히 복잡해지기 때문입니다. 나는 이것을 시도 할 때 오류가 발생했습니다. 처음에는 위 코드를 모두 signal.v 파일로 이동하려고 시도했습니다. 그런 다음 그림과 같이 두 파일 사이에 와이어를 사용했습니다.

module signal(clk, get_tx); 
    input clk; 
    output reg get_tx; 
    reg [1:0] counter; 

    always @(posedge clk) begin 
     counter = counter + 1; 
     if (counter[1] == 1) begin 
     get_tx[15:0] <= 16'b1010101010101010; 
     else 
     get_tx[15:0] <= 16'b0000000000000000; 
    end 

그런 다음 main.v에, 나는 출력 오실로스코프에 표시되는 내용을 바탕으로

wire get_tx; 
reg [15:0] tx; 
signal my_signal(.clk(clk), .get_tx(get_tx)); 
always @(get_tx) begin 
    tx <= get_tx; 
end 

는,이 방법은 작동하지 않습니다 추가했는데, 그 이유를 확실하지 않다 이것은. 첫 번째 사례는 정상적으로 작동하는 것으로 보이므로 두 번째 사례로 이동할 때 실패 이유를 알 수 없습니다 (신호가 완전히 다르게 보입니다). 도움/조언을 부탁드립니다.

답변

2

모듈 선언이있는 전체 코드를 추가하면 먼저 연결을 이해하고 코드를 시뮬레이트하는 것이 좋습니다.
문제는 신호 유형에 있습니다. 출력을 wire으로 변경하십시오. 뿐만 아니라 1 비트 신호가 아니라 버스를 선언해야합니다. 그리고 귀하의 카운터에 초기 값을주십시오 (다른 경우에는 'X' +1의 결과로 'X'이되며 귀하의 상태는 if (counter[1] == 1)가되지 않습니다). 상위 모듈

module signal(clk, get_tx); 
    input clk; 
    output [15:0] get_tx; 
    reg [15:0] tx_out; 
    reg [1:0] counter = 2'd0; 

    always @(posedge clk) begin 
     counter = counter + 1; 
     if (counter[1] == 1) 
     tx_out[15:0] <= 16'b1010101010101010; 
     else 
     tx_out[15:0] <= 16'b0000000000000000; 
    end 
    assign get_tx = tx_out; 
endmodule 

다음 오류가있다 당신은 또한 하나의 비트 wire [15:0] get_tx;보다는 버스를 선언해야합니다.
이 오류를 수정하면 모듈이 작동합니다.

+0

출력은 Verilog의 레지스터가 될 수 있습니다. – Laleh

+0

네, 맞습니다. 진술을 삭제했습니다. – Roman

+0

그게 작동합니다 - 고마워요! –