DigiKeyで買うものが決まらないのだが、とりあえず後段の回路の設計のために、LMH1981のビヘイビアモデルをVerilogでサクッっと書いてみました。
H-SYNCとV-SYNCの関係がイマイチデータブックからは読み取りがたいのですが、まあこのへんは現物を見てからということで。。。
簡単なテストベンチを用意して、Veritakを使って動かしてみるが、まあ所望する動作をしているようです。
最後にソースを張っておきます。もちろん「なんちゃってモデル」なので、ビデオ信号を入力できるわけではなく、単に出力をするだけ。それもCSYNCは「はしょって」あります(どうせ使い道ないでしょ?)。
---
[本日の御託]
ん~、これ欲しい。hauppauge HD PVR Model1212ハードウェアでのH264エンコードは「地雷」かも知れないが、$249は魅力だ・・・
(インデントがめちゃめちゃ)
//
// NS LMH1981 simplified bahavior model (C)2008 B.O.
// public tasks
// task p1080 -- perform 1 frame with 1080p
// task p720 -- perform 1 frame with 720p
// task p480 -- perform 1 frame with 480p
// task i1080 -- perform 1 frame with 1080i
// task i480 -- perform 1 frame with 480i
`timescale 1ns/1ns
module LMH1981(
output reg hsout_o , // H sync
output reg vsout_o , // V sync
output reg oeout_o , // Odd (oe=0), Even (oe=1)
output vfout_o // VF DATA
) ;
reg [10:0] line, maxline ;
reg interlace ;
time t_hinterval, t_hsout ;
real vsync_delay ; // unit is H preiod
integer frame ;
wire frame2, startofframe ; // debug purpose
reg [10:0] Data ; // for vfout
assign vfout_o = Data[10] ;
// debug purpose
assign frame2 = (frame == 2) ? 1'b1 : 1'b0 ;
assign startofframe = (line == 1 ) ? 1'b1 : 1'b0 ;
// internal tasks
task HSync ;
begin
for( line = 1 ; line <= maxline ; line = line + 1 ) begin
fork
begin
hsout_o <= 1'b0 ;
#(t_hsout) hsout_o <= 1'b1 ;
end
# t_hinterval ;
join
end
end
endtask //HSync ;
task VSync ;
integer maxframe ;
begin
vsout_o <= 1'b1 ;
if( interlace ) begin
maxframe = 2 ;
oeout_o <= 1'b0 ;
end // if
else begin
maxframe = 1 ;
oeout_o <= 1'b1 ;
end // if
for( frame = 1 ; frame <= maxframe ; frame = frame + 1 ) begin
fork
begin
# (vsync_delay * t_hinterval )
vsout_o <= 1'b0 ;
if( interlace ) begin
oeout_o <= ~oeout_o ;
end // if
# (3 * t_hinterval )
vsout_o <= 1'b1 ;
end
#( maxline/2.0 * t_hinterval) ;
join
end // for
end
endtask // VSync
task VFData ;
integer frame, maxframe ;
begin
Data = 10'd0 ;
if( interlace ) begin
maxframe = 2 ;
end // if
else begin
maxframe = 1 ;
end // else
for( frame = 1 ; frame <= maxframe ; frame = frame + 1 ) begin
@(negedge vsout_o ) ;
repeat(3)
@(negedge hsout_o ) ;
if ( interlace ) begin
if( frame == 1 ) begin
Data <= maxline /2 - 2 ;
end // if
else begin
Data <= maxline /2 - 3 ;
end // else
end // if
else begin
Data <= maxline - 3 ;
end // else
repeat( 11 ) begin
@(negedge hsout_o )
Data <= Data << 1 ;
end // repeat
end // for
end
endtask // VFData ;
task Do1Frame ;
begin
fork
HSync ;
VSync ;
VFData ;
join
end
endtask // Do1Frame ;
//
// Public task to control the model
//
task p1080 ;
begin
maxline = 1125 ;
t_hinterval = 1_000_000_000 / maxline / 29.97 ;
t_hsout = 475 ;
interlace = 1'b0 ; // false
vsync_delay = 1 ; // 1 H
Do1Frame ;
end
endtask // p1080 ;
task p720 ;
begin
maxline = 750 ;
t_hinterval = 1_000_000_000 / maxline / 29.97 ;
t_hsout = 525 ;
interlace = 1'b0 ; // false
vsync_delay = 1 ; // 1 H
Do1Frame ;
end
endtask // p720 ;
task p480 ;
begin
maxline = 525 ;
t_hinterval = 1_000_000_000 / maxline / 29.97 ;
t_hsout = 2300 ;
interlace = 1'b0 ; // false
vsync_delay = 7 ; // 7 H
Do1Frame ;
end
endtask // p480 ;
task i1080 ;
begin
maxline = 1125 ;
t_hinterval = 1_000_000_000 / maxline / 29.97 ;
t_hsout = 475 ;
interlace = 1'b1 ; // true
vsync_delay = 0.5 ; // 0.5 H
Do1Frame ;
end
endtask // i1080 ;
task i480 ;
begin
maxline = 525 ;
t_hinterval = 1_000_000_000 / maxline / 29.97 ;
t_hsout = 2500 ;
interlace = 1'b1 ; // true
vsync_delay = 3.5 ; // 3.5 H
Do1Frame ;
end
endtask // i480 ;
endmodule // LMH1981