2011-05-02 11 views
0
module DoorControl(clk, data, open,addressOftheMemory, outp); 

localparam Size_ofTheWord = 32; 
input open; 

input [16:0] addressOftheMemory; 
input [Size_ofTheWord-1:0] data; 

input clk ; 
output reg outp; 
reg [WordSize-1: 0] Memory [65535: 0]; 


always @ (open) // open is 1 or 0 
    if (open )   
    // i 
    outp = Memory[addressOftheMemory]; 
    else if (!open)  
    Memory[addressOftheMemory] = data; 


endmodule 

라인은 (i)로 표시, 출력 포트로 outp를 보내기 전에 그냥 posedge clk을 기다리고 싶습니다. 그러나, 내가봤을 때;일하기 전에 posedge clk를 ​​기다리고 있습니까? - 어떻게

if (posedge clk) 

는 오류를

while (clk != 1) begin 

end 

가 제공 absurb 응답/시뮬레이션 출력을 제공한다. 출력을 보내기 전에 posedge clk을 기다리려면 그 행에 무엇을 넣어야합니까?

답변

0

이 같은 클럭 에지 때까지 실행을 지연 할 수 있습니다

always @ (open) // open is 1 or 0 
    if (open ) 
    @(posedge clk) outp = Memory[addressOftheMemory]; 
    else if (!open)  
    Memory[addressOftheMemory] = data; 

또는 당신이 원하는 것을 달성하지 않을 수도있다. 그것은 합성 가능하지 않고 always 블록은 실행 중이거나 일시 중단 된 상태에서 일정이 조정되지 않으므로 open이 시계 기간에 여러 번 토글하는 경우 해당 코드는 사용자가 원하는대로 수행하지 못할 수도 있습니다.

기타 배경 : null 명령문을 포함하여 모든 명령문에서 지연/이벤트 제어를 지정할 수 있습니다. (예 @(posedge clk);에서, 세미콜론은 널 문입니다.) 사실에서, always 구조의 구문 정의는 다음과 같습니다

always_construct : 약 마법 아무것도 없다는 것을 의미 항상

always @(open) 또는 always @(posedge clk) 인 경우 단순히 명령문을 소개하고 이벤트 제어를 지정하는 것입니다. 지연 제어 (#)가 명령문에 첨부 된 경우, 명령문의 실행은 앞으로 일정한 시간까지 지연됩니다. 명령문 (@)이 명령문에 첨부 될 때, 명령문의 실행은 이벤트 조건이 충족 될 때까지 지연됩니다.

2

당신이 모델링하려고하는 것에 대해 좀 더 비판적으로 생각해야합니다. 읽기/쓰기 작업을 제어하는 ​​"열린"상태로 메모리를 모델링하려고하는 것 같습니다.

데이터의 비동기 쓰기 & 데이터의 동기 읽기가 있습니다. 메모리 액세스의 경우 완전한 동기 동작을 갖는 것이 좋습니다.

always @(posedge clk) begin 
if(open) 
    outp = Memory[addressOftheMemory]; 
else 
    Memory[addressOftheMemory] = data; 
end 
+0

완전히 동의합니다. 동기 로직을 ​​사용하면 클럭이 기본입니다. – Marty