危障的發生和解決方法
消除1-hazard的方法
1.首先先找出hazard發生的點
2.圈出hazard周圍最大的面積的1,3.得到a’b
4.把a’b加入f=a’c’+bc即可解除hazard
消除0-hazard的方法
先把卡諾圖f的0轉成1
f=a’c’+bc+a’b
再由卡諾圖得到f’
f'=ac'+bc'+ab'
把f’再反回來成為(f’)’
=>(f')'=(ac'+b'c+ab')’
=(ac’)’.(b’c)’.(ab’)’
=(a’+c).(b+c’).(a’+b)
=a’ba’+a’bb+a’c’a’+a’c’b+cba’+cbb+cc’a’+c’cb
得到的結果與消除1-hzazrd的方法一樣
=a’c’+bc+a’b
Hazard:
//CODE:
//1-HAZARD
module hazard(cout,a_bar,b,c);
input a_bar,b,c;
output cout;
wire w1,w2,c_bar;
and #5(w2,c,b);
not #5(c_bar,c);
and #5(w1,a_bar,c_bar);
or #5(cout,w1,w2);
endmodule
//消除hazard
module hazard(cout,a_bar,b,c);
input a_bar,b,c;
output cout;
wire w1,w2,w3,c_bar;
and #5(w2,c,b);
not #5(c_bar,c);
and #5(w1,a_bar,c_bar);
and #5(w3,a_bar,b);
or #5(cout,w1,w2,w3);
endmodule
系統時脈:
module top;
wire a_bar,b,c;
wire cout;
system_clock #200 clock1(a_bar);
system_clock #150 clock2(b);
system_clock #100 clock3(c);
hazard a1(cout,a_bar,b,c);
endmodule
//----------------------------------------
module system_clock(clk);
parameter PERIOD = 100;
output clk;
reg clk;
initial
clk = 0;
always
begin
#(PERIOD/2) clk = ~clk;
#(PERIOD/2) clk = ~clk;
#(PERIOD/2) clk = ~clk;
end
always@(posedge clk)
if($time > 1000) #(PERIOD-1)$stop;
endmodule