📄 colorled32.tdf
字号:
include"4count";
include"8count";
include"10count";
include"12count";
include"4x40pll";
include"digitalfilter";
include"dpram1024x32";
subdesign colorled32
(
inclk :input;
in_red[7..0], in_grn[7..0], in_blu[7..0] :input;
hsync, vsync, pclk :input;
mad[15..0], sad[15..0] :bidir;
ma[17..0], mcs, mwr, mrd, mub, mlb :output;
sa[17..0], scs, swr, srd, sub, slb :output;
led[63..0] :output;
free1, free55, free56 :output;
)
variable
innerclk0 :node;
innerpclk, innerhsy, innervsy :node;
lednode[31..0] :node;
clk0[1..0], stb[1..0] :node;
clk40m, clk10m, clk5m :node;
rddpram[9..0] :node;
hozvalid, vervalid :dff;
renew[1..0], out2led :dff;
convertdff0[31..0][31..0] :dff;
convertdff1[31..0][31..0] :dff;
phasea :dff;
lath :node;
fd :4count;
wrincnt :12count;
framecnt :12count;
inrowcnt :10count;
outcnt, incolcnt, ledcnt :12count;
4pll :4x40pll;
wrram :dpram1024x32;
hsynfilter, vsynfilter :digitalfilter;
begin
defaults
ma[] = gnd;
sa[] = gnd;
mwr = vcc;
mrd = vcc;
swr = vcc;
srd = vcc;
mcs = gnd;
mub = gnd;
mlb = gnd;
scs = gnd;
sub = gnd;
slb = gnd;
fd.clk_en = vcc;
fd.aclr = gnd;
fd.sclr = gnd;
incolcnt.clk_en = vcc;
incolcnt.sclr = gnd;
inrowcnt.clk_en = vcc;
inrowcnt.sclr = gnd;
wrincnt.sclr = gnd;
convertdff0[][].clk = vcc;
convertdff1[][].clk = vcc;
outcnt.sclr = gnd;
ledcnt.sclr = gnd;
framecnt.sclr = gnd;
framecnt.aclr = gnd;
framecnt.clk_en = vcc;
renew[0] = vcc;
out2led.clrn = vcc;
ledcnt.clk_en = vcc;
led[] = gnd;
end defaults;
4pll.inclk0 = inclk;
innerclk0 = 4pll.c0;
clk40m = inclk;
fd.clock = inclk;
clk10m = fd.q[1];
clk5m = fd.q[2];
innerpclk = !pclk;
-- innerhsy = lcell(hsync);
-- innervsy = vsync;
innervsy = vsynfilter.adataout;
vsynfilter.datain = vsync;
vsynfilter.inclk = innerclk0;
innerhsy = hsynfilter.adataout;
hsynfilter.datain = hsync;
hsynfilter.inclk = innerclk0;
incolcnt.aclr = !(innerhsy & innervsy);
incolcnt.clock = innerpclk;
inrowcnt.clock = !innerhsy;
inrowcnt.aclr = !innervsy;
framecnt.clock = innervsy;
-- vervalid = (inrowcnt.q[9..5] == 0) & innervsy;
vervalid.clk = innerpclk;
if vervalid then
vervalid = (inrowcnt.q[9..0] != 256 + 31);
else
vervalid = (inrowcnt.q[9..0] == 256);
end if;
wrincnt.aclr = !innervsy;
wrincnt.clk_en = hozvalid & vervalid;
wrincnt.clock = innerpclk;
-- hozvalid = (incolcnt.q[11..5] == 0) & innerhsy;
hozvalid.clk = innerpclk;
if hozvalid then
hozvalid = (incolcnt.q[10..0] != 255 + 32);
else
hozvalid = (incolcnt.q[10..0] == 255);
end if;
wrram.data[31..24] = in_blu[];
wrram.data[23..16] = in_red[];
wrram.data[15..8] = in_grn[];
%
case framecnt.q[10..9] is
when 0=>
if framecnt.q[8] then
wrram.data[31..8] = (framecnt.q[7..6] == wrincnt.q[6..5]);
else
wrram.data[31..8] = (framecnt.q[7..6] == wrincnt.q[4..3]);
end if;
-- wrram.data[31..24] = framecnt.q[8..1];
-- wrram.data[23..16] = framecnt.q[8..1];
-- wrram.data[15..8] = framecnt.q[8..1];
when 1=>
if framecnt.q[8] then
wrram.data[31..24] = gnd;
wrram.data[23..16] = (framecnt.q[7..6] == wrincnt.q[6..5]);
wrram.data[15..8] = gnd;
else
wrram.data[31..24] = gnd;
wrram.data[23..16] = (framecnt.q[7..6] == wrincnt.q[4..3]);
wrram.data[15..8] = gnd;
end if;
-- wrram.data[31..24] = framecnt.q[8..1];
-- wrram.data[23..16] = gnd;
-- wrram.data[15..8] = gnd;
when 2=>
if framecnt.q[8] then
wrram.data[31..24] = gnd;
wrram.data[23..16] = gnd;
wrram.data[15..8] = (framecnt.q[7..6] == wrincnt.q[6..5]);
else
wrram.data[31..24] = gnd;
wrram.data[23..16] = gnd;
wrram.data[15..8] = (framecnt.q[7..6] == wrincnt.q[4..3]);
end if;
-- wrram.data[31..24] = gnd;
-- wrram.data[23..16] = framecnt.q[8..1];
-- wrram.data[15..8] = gnd;
when 3=>
if framecnt.q[8] then
wrram.data[31..24] = (framecnt.q[7..6] == wrincnt.q[6..5]);
wrram.data[23..16] = gnd;
wrram.data[15..8] = gnd;
else
wrram.data[31..24] = (framecnt.q[7..6] == wrincnt.q[4..3]);
wrram.data[23..16] = gnd;
wrram.data[15..8] = gnd;
end if;
-- wrram.data[31..24] = gnd;
-- wrram.data[23..16] = gnd;
-- wrram.data[15..8] = framecnt.q[8..1];
end case;
%
wrram.data[7..6] = b"11";
wrram.data[5..0] = h"0f";
wrram.wraddress[9..0] = wrincnt.q[9..0];
wrram.wren = hozvalid & vervalid;
wrram.wrclock = innerpclk;
renew[0].clk = !vervalid;
outcnt.aclr = outcnt.q[10];
outcnt.clk_en = renew[1];
outcnt.clock = clk5m;
renew[].clrn = !outcnt.q[10];
renew[1] = renew0.q;
renew[1].clk = clk5m;
rddpram[] = outcnt.q[9..0];
-- rddpram[4..0] = outcnt.q[4..0];
-- rddpram[9..5] = outcnt.q[9..5];
wrram.rdaddress[4..0] = rddpram[4..0];
wrram.rdaddress[9..5] = !rddpram[9..5];
wrram.rdclock = clk5m;
convertdff0[][] = wrram.q[];
convertdff1[][] = wrram.q[];
%
case framecnt.q[10..9] is
when 0 =>
convertdff0[][7..0] = h"ff";
convertdff1[][7..0] = h"ff";
if framecnt.q[8] then
convertdff0[][31..8] = (framecnt.q[7..5] == outcnt.q[7..5]);
convertdff1[][31..8] = (framecnt.q[7..5] == outcnt.q[7..5]);
else
convertdff0[][31..8] = (framecnt.q[7..5] == outcnt.q[4..2]);
convertdff1[][31..8] = (framecnt.q[7..5] == outcnt.q[4..2]);
end if;
when 1 =>
convertdff0[][23..8] = gnd;
convertdff1[][23..8] = gnd;
convertdff0[][7..0] = h"ff";
convertdff1[][7..0] = h"ff";
if framecnt.q[8] then
convertdff0[][31..24] = (framecnt.q[7..5] == outcnt.q[7..5]);
convertdff1[][31..24] = (framecnt.q[7..5] == outcnt.q[7..5]);
else
convertdff0[][31..24] = (framecnt.q[7..5] == outcnt.q[4..2]);
convertdff1[][31..24] = (framecnt.q[7..5] == outcnt.q[4..2]);
end if;
when 2 =>
convertdff0[][31..24] = gnd;
convertdff1[][31..24] = gnd;
convertdff0[][15..8] = gnd;
convertdff1[][15..8] = gnd;
convertdff0[][7..0] = h"ff";
convertdff1[][7..0] = h"ff";
if framecnt.q[8] then
convertdff0[][23..16] = (framecnt.q[7..5] == outcnt.q[7..5]);
convertdff1[][23..16] = (framecnt.q[7..5] == outcnt.q[7..5]);
else
convertdff0[][23..16] = (framecnt.q[7..5] == outcnt.q[4..2]);
convertdff1[][23..16] = (framecnt.q[7..5] == outcnt.q[4..2]);
end if;
when 3 =>
convertdff0[][31..16] = gnd;
convertdff1[][31..16] = gnd;
convertdff0[][7..0] = h"ff";
convertdff1[][7..0] = h"ff";
if framecnt.q[8] then
convertdff0[][15..8] = (framecnt.q[7..5] == outcnt.q[7..5]);
convertdff1[][15..8] = (framecnt.q[7..5] == outcnt.q[7..5]);
else
convertdff0[][15..8] = (framecnt.q[7..5] == outcnt.q[4..2]);
convertdff1[][15..8] = (framecnt.q[7..5] == outcnt.q[4..2]);
end if;
end case;
%
-- for i in 0 to 31 generate
-- if i == outcnt.q[4..0] then
-- if !outcnt.q[5] then
-- convertdff0[i][].clk = clk5m;
-- else
-- convertdff1[i][].clk = clk5m;
-- end if;
-- end if;
-- end generate;
%
for i in 0 to 31 generate
if i == outcnt.q[4..0] then
convertdff0[i][].clk = outcnt.q[5] # clk5m;
convertdff1[i][].clk = !outcnt.q[5] # clk5m;
end if;
end generate;
%
case outcnt.q[4..0] is
when 0 =>
convertdff0[0][].clk = outcnt.q[5] # clk5m;
convertdff1[0][].clk = !outcnt.q[5] # clk5m;
when 1 =>
convertdff0[1][].clk = outcnt.q[5] # clk5m;
convertdff1[1][].clk = !outcnt.q[5] # clk5m;
when 2 =>
convertdff0[2][].clk = outcnt.q[5] # clk5m;
convertdff1[2][].clk = !outcnt.q[5] # clk5m;
when 3 =>
convertdff0[3][].clk = outcnt.q[5] # clk5m;
convertdff1[3][].clk = !outcnt.q[5] # clk5m;
when 4 =>
convertdff0[4][].clk = outcnt.q[5] # clk5m;
convertdff1[4][].clk = !outcnt.q[5] # clk5m;
when 5 =>
convertdff0[5][].clk = outcnt.q[5] # clk5m;
convertdff1[5][].clk = !outcnt.q[5] # clk5m;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -