📄 decoder.vhd
字号:
--分频与计数
PROCESS(clk2x,clr,den)
BEGIN
IF(clr='1')THEN --清零
count17<="00000";
ELSIF(clk2x'EVENT AND clk2x='1')THEN --clk2x上升沿
IF(count17="10000")THEN
count17<="00000"; --计数0-16即17计数
ELSIF(den='1')THEN
count17<=count17+'1';
END IF;
END IF;
END PROCESS;
--同步字头检测
IF(clk1x'EVENT AND clk1x='1')THEN
reg1<=d;reg2<=reg1;reg3<=reg2; --6位移位寄存器
reg4<=reg3;reg5<=reg4;reg6<=reg5;
IF(clr='1')THEN
cd<='0';
ELSIF((reg1='1' AND reg2='1' AND reg3='1')AND(reg4='0' AND reg5='0' AND reg6='0'))THEN
cd<='0';
ELSIF((reg1='0' AND reg2='0' AND reg3='0')AND(reg4='1' AND reg5='1' AND reg6='1'))THEN
cd<='1'; --判别数据类型
END IF;
END IF;
IF(clk1x'EVENT AND clk1x='1')THEN --计0,1个数
IF(clr='1' OR ct1="111" OR ct0="111")THEN
ct1<="000";ct0<="000";
ELSIF(d='1')THEN
ct0<="000";
ct1<=ct1+"001"; --出现1,ct1加1,ct0清零
ELSIF(d='0')THEN
ct1<="000";
ct0<=ct0+"001"; --出现0,ct1清零,ct0加1
END IF;
END IF;
IF(clr='1' OR count17="10000")THEN
sc<='0';
ELSIF(ct0="010")THEN
sc<='1';
END IF;
IF(clr='1' OR count17="10000")THEN
sd<='0';
ELSIF(ct1="010")THEN
sd<='1'; --sc,sd分别为ct0,ct1计数到3个的0或1产生的信号
END IF;
IF(clr='1' OR count17="10000")THEN
den<='0';
ELSIF(sc='1' AND sd='1')THEN --sc=1,sd=1说明出现了111000或000111的数据
den<='1'; --信号den为高表示解码周期开始
ELSE
den<='0';
END IF;
IF(count17>="00000" AND count17<="01111")THEN
sentd<='1' AND den; --生成sentd信号,后面再将其输出到sentdata
ELSE
sentd<='0';
END IF;
--解码与奇校验
IF(clr='1')THEN
data<='0';
END IF;
data<=NOT(clk2x XOR d); --解码
IF(count17="10000")THEN
jo<=data; --jo为编码的奇校验
ELSE
jo<='0';
END IF;
IF(clk2x'EVENT AND clk2x='1')THEN
IF(sentd='1')THEN
jojy<=jojy XOR d; --jojy为解码输出数据的奇校验
ELSE
jojy<='0';
END IF;
END IF;
IF(clr='1')THEN
f<='0';
ELSIF(count17="10000")THEN
f<=jo XOR jojy; --判断数据是否有错误
ELSE
f<='0';
END IF;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -