2013-08-02 2 views
1

Verilog에서 8086 프로세서를 만들려고 노력하고 있으며, 아키텍처의 대부분을 평균 이상으로 잘 이해하고 있습니다. 포인트),하지만 ALU에서 캐리 플래그와 보조 플래그가 작동하는 방식에 대해 머리를 감싸는 것처럼 보일 수는 없습니다.x86 ALU의 캐리/보조 플래그 기능

나는 CF가 결과가 ALU의 비트 폭보다 커지게하는 더하기 또는 빼기 (이 경우 Borrow라고 함)시 트리거된다는 것을 알고 있습니다.

하지만 어떻게하면 FLAGS [0] (CF) 비트에 쓰고 다시 액세스하여 작업을 계속할 수있게 해주는 더하기와 빼기를 위해 Verilog 코드를 작성해야합니까? 누구든지 제가 해체 할 수있는 예를 들어 줄 수 있습니까?

또한 SIFT와 DI 레지스터의 너비가 16 비트 인 경우 캐리 연산을 사용하는 ALU가 17 비트 수 생성을 지원할 수있는 방법은 무엇입니까? 그 여분의 비트는 어디로 간다? 곱셈이 동일한 비트 오버플로를 생성하면 어떻게됩니까?

초보자 용 질문에 사과드립니다. 나는 거의 확실한 기분이나 이해 부족에 대해 큰 소리로 외쳤다. 이 점을 이해하기 위해 코드 라인을 제공하고 도움을 줄 수있는 사람에게 많은 감사를드립니다.

답변

1

이 무엇인지 잘 모르겠다. 다시 작업하여 작업을 계속할 수 있지만, 16 비트 덧셈/뺄셈에서 캐리 비트를 생성하는 방법을 묻는다면

always @ posedge clk begin 
    if(add_with_carry) 
    {CF[0], result[15:0]} <= a[15:0] + b[15:0]; 
    else if(sub_with_carry) 
    {CF[0], result[15:0]} <= a[15:0] - b[15:0]; 
    else if(add_without_carry) 
      result[15:0] <= a[15:0] + b[15:0]; 
    else if(sub_without_carry) 
      result[15:0] <= a[15:0] - b[15:0]; 
end 

이것은 17 비트 레지스터에 그 결과를 작성하는 것과 같은 일이 또한 기본적으로 다음 단 결과 [16] 등의 지정 : 편도 (두 개의 다른 레지스터에 발생 쓰기 이용 연결)를 한번 수행 할 캐리 플래그.

+0

오케이. 따라서 이러한 연산의 결과는 CF FLAGS 비트와 레지스터 결과의 조합이됩니다. 그것은 내게 훨씬 더 이해가됩니다. 저는 제 어리 석음으로 ALU가 어떻게 든 그들을 합쳐서 어딘가에 집어 넣을 것이라고 생각했습니다. – ecfedele

+0

이제 프로세서가 carry bit없이 CF 비트를 설정하는 두 개의 값을 추가하라는 메시지가 표시되면 어떻게됩니까? – ecfedele

+0

캐리 비트를 건드리지 않고 추가하는 추가 연산이 필요한 경우, CF에 쓰지 않고 추가 작업을 수행하는 등의 다른 작업을 수행하기 위해 'if'절에 절을 추가 할 수 있습니다. 할 수있는 여러 가지 방법이 많이 있습니다. – Tim

관련 문제