WDT(ウォッチドッグタイマ)とクロックジェネレータです。WDTはもともと(私にとっては)どーでもいい部分(だって使うつもりないもん)だし、SLEEP命令も使うつもりはないので(したがって、クロックも止める必要なし)、完全にビヘイビアモデルで実装。
WDTのリトリガブルワンショットは、Verillog-HDLの規格書(IEEE-1364.2001)に類似の例があります。
(う~ん、意外にはかどらないな...)
----
本日の御託
「7人のメタボ侍、内臓脂肪を斬る」
笑えない、というか,ほとんど切ないニュース。労災になるのだろうか?
//
// Watch Dog Timet
// (c) 2007 BakaOyaji
// $Id$
//
// Behavior implementation
`timescale 1ns/1ns
module watchdogtimer(
input clk_i,
input reset_i ,
output reg wdt_o
);
initial begin
wdt_o = 0 ;
end // initial
always begin : monostable
@( negedge reset_i )
# 3000 wdt_o = 1'b1 ;
end // monostable
always @( posedge reset_i) begin
disable monostable ;
wdt_o = 1'b0 ;
end
endmodule // watchdogtimer(
// EOF watchdogtimer.v
//
// Clock Generater
// (c) 2007 BakaOyaji
// $Id$
//
// Behavior implementation
// (c) 2007 BakaOyaji
`timescale 1ns/1ns
// 1MHz
`define CYCLE 1000
module clockgen (
input go_sleep_i,
input wakeup_a_i ,
output reg clk_o ,
output reg wakeup_o
);
initial begin
clk_o = 0 ;
wakeup_o = 1'b0 ;
forever begin
begin : run
forever begin
clk_o = 1'b1 ;
#(`CYCLE/2)
if ( go_sleep_i ==1'b1 ) begin
disable run ;
end // if
clk_o = 1'b0 ;
#(`CYCLE/2) ;
end // forever
end // run
@( posedge wakeup_a_i )
clk_o = 1'b0 ;
wakeup_o = 1'b1 ;
#(`CYCLE/2)
clk_o = 1'b1 ;
#(`CYCLE/2)
clk_o = 1'b0 ;
wakeup_o = 1'b0 ;
#(`CYCLE/2) ;
end // forever
end // initial
endmodule // clockgen
// EOF clockgen.v