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

📄 coder.vhd

📁 《CPLD_FPGA设计及应用》课件与实例
💻 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 + -