2017-09-07 1 views
-2
  1. i_a 및 i_b라는 두 개의 4 비트 입력을 수용합니다.
  2. o_sum이라는 4 비트 숫자를 출력합니다.
  3. 합계가 1111보다 큰 경우 o_err이라는 1 비트 숫자를 출력합니다.
  4. 두 입력을 지속적으로 추가하고 결과 합계와 오류 비트를 출력에 할당하려면 always @ 블록을 사용합니다.

Verilog를 처음 접한다면 누군가 내가이 일을 제대로 수행하고 있는지 말해 줄 수 있습니까?Verilog : 4 비트 입력을 2 개 허용하고 4 비트 출력을 출력하는 모듈

module add4 (
    o_sum, // Sum out 
    o_err, // Error out 
    i_a, // Addend A 
    i_b, // Addend B 
); 

    output reg [3:0] o_sum; 
    output reg [1:0] o_err; 
    input [3:0] i_a, i_b; 

    [email protected](*) 
    begin 
    if (o_sum = i_a + i_b >1111) 
    o_sum = o_err; 
    else 
    o_sum = i_a + i_b; 
    end 
endmodule 
+0

테스트 벤치를 생성하고 시뮬레이션을 실행하여 옳은지 여부를 스스로 증명하십시오. – toolic

+1

'o_err'은 설명과 같이 1 비트가 아닌 2 비트 신호이고, '1111'은 10 진수입니다. 이진수를 의미 할 수 있습니다. 과제를 'if'조건으로 두지 마십시오. o_sum에 o_err을 할당 할 필요는 없습니다. – Serge

답변

0

실수가 많은 코드에있다

  1. output reg [1:0] o_err; 당신은 o_err 1 비트, 그것은 출력 레지 o_err해야한다이고;

  2. o_sum = o_err; 당신의 o_sum는 o_sum가 4 비트이기 때문에 o_sum가 1111보다 큰 경우 다음

  3. if (o_sum = i_a + i_b >1111)이 평가 할 수없는 4 비트되지 않습니다. 또한 4'b1111이어야하며 그렇지 않은 경우 10 진수 여야합니다.

지금 코드에오고,이
module add4 (
    o_sum, // Sum out 
    o_err, // Error out 
    i_a, // Addend A 
    i_b, // Addend B 
); 

    output reg [3:0] o_sum; 
    output wire o_err; 
    input [3:0] i_a, i_b; 

    reg carry; 

    [email protected](*) 
    {carry, o_sum} = i_a + i_b; 

    assign o_err = (carry == 1)?1'b1:1'b0; 

endmodule 

은 또한, 설계의 정확성을 테스트하는 테스트 벤치를 사용하려고하십시오, 작동합니다. 그것은 회원들에게 더 감사 할 것입니다.

+0

'? 1 : 0' 안티 패턴으로 누군가가 그것을 가르쳐야한다고 맹세합니다. 삼항은 완전히 중복됩니다. 테스트를 그대로두면 동등하게 작동합니다. 이 경우에는 한 단계 더 나아가서 o_err을 add의 carry 위치에 직접가집니다. –

+0

당신 말이 맞아요. 그것은 끝났을 수 있습니다. 나는 이것이 더 간단하게 보이게하기 위해 이것을했다. –

관련 문제