⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 colorled32.tdf

📁 这是一个用于32位色控制的LED大屏幕的AHDL代码
💻 TDF
📖 第 1 页 / 共 2 页
字号:
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 + -