📄 coder.vhd
字号:
--分频器设计
PROCESS(clk,clr)
BEGIN
IF(clk'EVENT AND clk='1')THEN --原始时钟
IF(clr='1' or count2="11")THEN --清零
count2<="00";
ELSE
count2<=count2+"01"; --计数,上升沿加1
END IF;
END IF;
END PROCESS;
clk1x<=clk; --生成clk1x,clk2x
clk2x<=count2(0);
--计数器设计
PROCESS(clk1x,clr,en)
BEGIN
IF(clr='1')THEN
count40<="000000"; --清零
ELSIF(clk1x'EVENT AND clk1x='1')THEN
IF(count40="100111")THEN
count40<="000000";
ELSIF(en='1')THEN
count40<=count40+'1'; --计数0-39
END IF;
END IF;
END PROCESS;
--移位寄存器与奇偶校验位生成
PROCESS(clk2x,d,en) --en为编码使能信号,d为输入信号
BEGIN
IF(clk2x'EVENT AND clk2x='1')THEN --clk2x上升沿
IF(en='1')THEN
reg3<=d;
reg2<=reg3;
reg1<=reg2; --3位移位寄存器
END IF;
din<=reg1;
END IF;
END PROCESS;
--奇校验的VHDL源程序如下:
PROCESS(din,count40,clk2x,en) --count40为40计数
BEGIN
IF(clk2x'EVENT AND clk2x='1')THEN
IF(count40>="000110"AND count40<="100101")THEN
jo<=jo XOR din; --在计数6-37时,即16位数据输入时进行奇校验
ELSIF(count40>="000000"AND count40<="000101")THEN
jo<='0'; --在0-5时不进行校验,可用来清零,否则下次校验可能出错
END IF;
END IF;
END PROCESS;
--编码模块
--方案一
PROCESS(clk,clr)
BEGIN
IF(clr='1')THEN
q1<='0';
ELSE
q1<=NOT(clk XOR d); --q1为同或编码
END IF;
END PROCESS;
--方案二
PROCESS(clk,clr)
BEGIN
IF(clk'EVENT AND clk='1')THEN
d1<=d; --d1为d,d2为d的非,待2选1输入
d2<=NOT d;
END IF;
IF(clr='1')THEN
q2<='0';
ELSIF(clk='0')THEN
q2<=d2;
ELSIF(clk='1')THEN --2选1选择器
q2<=d1;
END IF;
END PROCESS;
--帧封装模块
PROCESS(din,en,clr,jo,cnmd,clk2x,clk1x,count40) --din通过3位寄存器的数据
BEGIN
IF(count40>="000000"AND count40<="000010")THEN --0-2生成同步字头前3位
mo<=cnmd;
ELSIF(count40>="000011"AND count40<="000101")THEN --3-5生成同步字头后3位
mo<=NOT cnmd;
ELSIF(count40>="000110"AND count40<="100101")THEN --6-37同或生成曼码
mo<=NOT(din XOR clk2x);
ELSIF(count40>="100110"AND count40<="100111")THEN --38-39异或生成奇校验曼码
mo<=(jo XOR clk2x); --如果同或则为偶校验
ELSE
mo<='0';
END IF;
IF(clr='1')THEN
q<='0';
ELSIF(clk1x'EVENT AND clk1x='1')THEN --去毛刺
q<=mo;
END IF;
END PROCESS;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -