📄 tongbuchuankoujieshou.tdf
字号:
%
管脚: 方向, 特性。
clk: 输入, 20MHz
clr 入 低清零
data 出
dataclk 出
dataenable 出
d[] 出 数据总线
adr[] 入 地址总线(20,21,22,23,24)详见65行。
rd 入 读选通,单片机的读信号。
serialclk 入
serialdata 入
interrupt 出 给单片机的中断请求信号
geli[] 不用关心。
%
include "serialrcpt";
--用于测试孙建的同步串口软件
SUBDESIGN tongbuchuankoujieshou
(clk,clr :input;
data,dataclk,dataenable :output;
d[7..0] :output;
adr[4..0] :input;
rd :input;
serialclk,serialdata :input;
interrupt :output;
--cs :input;
geli[3..0] :output;
)
variable
xinxi[4..0][7..0] :node;
zongjishuqi[15..0] :dff;
jishuqi[5..0] :dff;
data :node;
shizhong[2..0] :dff;
serialclr :node;
serialreg[4..0][7..0] :node;
geli[3..0] :tri;
pin[7..0] :tri;
zhongduanjishu[7..0] :dff;
serialinterrupt :node;
begin
zhongduanjishu[].clrn=clr;
zhongduanjishu[].clk=shizhong2;
if serialinterrupt==vcc then
zhongduanjishu[]=zhongduanjishu[]+1;
elsif(zhongduanjishu[]==0 or zhongduanjishu[]==200) then
zhongduanjishu[]=0;
else
zhongduanjishu[]=zhongduanjishu[]+1;
end if;
if zhongduanjishu[]>100 then
interrupt=gnd;
else
interrupt=vcc;
end if;
geli[].oe=gnd;
geli[].in=gnd;
d[]=pin[].out;
(serialreg[][],serialinterrupt)=serialrcpt(serialclk,serialdata,serialclr);
-----------------------------------------------------------
if (adr[]>19 and adr[]<25) then
pin[].oe=!rd;
case adr[] is
when 20 =>
pin[].in=serialreg[0][];
when 21 =>
pin[].in=serialreg[1][];
when 22 =>
pin[].in=serialreg[2][];
when 23=>
pin[].in=serialreg[3][];
when 24 =>
pin[].in=serialreg[4][];
end case;
end if;
-----------------------------------------------------------
shizhong[].clrn=clr;
shizhong[].clk=clk;
shizhong[]=shizhong[]+1;
xinxi[0][]=h"48";--收到为"1234567890"
xinxi[1][]=h"2c";
xinxi[2][]=h"6a";
xinxi[3][]=h"1e";
xinxi[4][]=h"09";
zongjishuqi[].clrn=clr;
zongjishuqi[].clk=shizhong2;
if zongjishuqi[]>=25000 then
zongjishuqi[]=0;
else
zongjishuqi[]=zongjishuqi[]+1;
end if;
jishuqi[].clrn=clr;
jishuqi[].clk=shizhong2;
serialclr=clr;--同步串口复位
if (zongjishuqi[]<250 and zongjishuqi[]>0) then
if jishuqi[]>=49 then
jishuqi[].d=0;
else
jishuqi[].d=jishuqi[].q+1;
end if;
else
jishuqi[].d=0;
end if;
for i in 42 to 49 generate
if jishuqi[]==i then
if zongjishuqi[]<50 then
data=xinxi[0][i-42];
elsif zongjishuqi[]<100 then
data=xinxi[1][i-42];
elsif zongjishuqi[]<150 then
data=xinxi[2][i-42];
elsif zongjishuqi[]<200 then
data=xinxi[3][i-42];
elsif zongjishuqi[]<250 then
data=xinxi[4][i-42];
end if;
end if;
end generate;
--if (jishuqi[]<1 or jishuqi[]>8) then
-- data=gnd;
--end if;
-------------------------------------------------------------------------------
--使能输出
--if zongjishuqi[]<200 then
if (jishuqi[]>41) then
dataenable=gnd;
else
dataenable=vcc;
end if;
%else
if (jishuqi[]>45) then
dataenable=gnd;
else
dataenable=vcc;
end if;
end if;
%
-------------------------------------------------------------------------------
--数据时钟
if dataenable==gnd then
dataclk=!shizhong2;
else
dataclk=gnd;
end if;
-------------------------------------------------------------------------------
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -