名称:基于FPGA的密勒码编译码器设计Verilog代码VIVADO仿真
软件:VIVADO
语言:Verilog
代码功能:
1. 编码器(代码在工程文件中)
module miller_encoder(
signal_in,
signal_out,
clk,
o_start,
o_finish
);
//输入输出端口声明
input signal_in;
input clk;
output reg signal_out; //编码串行输出数据
output reg o_start; //编码数据开始输出指示
output reg o_finish; //编码数据输出完毕指示
2. 译码器(代码在工程文件中)
module miller_decoder(
signal_in,
signal_out,
clk,
o_start,
o_finish
);
//输入输出端口声明
input signal_in; //串行输入信号
input clk;
output reg signal_out; //解码串行输出数据
output reg o_start; //解码数据开始输出指示
output reg o_finish; //解码数据输出完毕指示
一、 仿真验证
1. 编码器仿真验证
//miller_encoder程序的测试程序
`timescale 10ns/1ns
module miller_encoder_tb;
//主要输入寄存器
reg clk;
reg clk2;
reg signal_in;
//主要输出声明
wire signal_out;
wire o_start;
wire o_finish;
reg temp;
reg [7:0] shift;
//待测试设计例化
miller_encoder my_miller_encoder(signal_in,signal_out,clk,o_start,o_finish);
//产生时钟周期是100个时间单位
always #50 clk=~clk;
always @(posedge clk)
begin
clk2<=~clk2;
end
//设计一个或多个激励信号发生器
initial
begin
clk=0;
clk2=0;
shift=16'b01001011;//信码是11010010
signal_in=shift[0];
temp=shift[0];
shift=shift>>1;
shift[7]=temp;
end
always @(posedge clk2)//注意这里是clk2时钟来控制输入数据一位一位往里进哟
begin
signal_in=shift[0];
temp=shift[0];
shift=shift>>1;
shift[7]=temp;
end
//检测输出信号
initial
begin
$monitor($time,"signal_out=%b o_start=%b o_finish= %b",signal_out,o_start,o_finish);
#8000 $finish;
end
endmodule
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
密勒码编解码
1.工程文件
2.编码程序文件
3.编码程序测试文件
4.编码程序仿真
5.译码程序文件
6.译码程序测试文件
7.译码程序仿真
部分代码展示:
module miller_decoder(
signal_in,
signal_out,
clk,
o_start,
o_finish
);
//输入输出端口声明
input signal_in;//串行输入信号
input clk;
output reg signal_out;//解码串行输出数据
output reg o_start;//解码数据开始输出指示
output reg o_finish;//解码数据输出完毕指示
//内部变量声明
reg [16:1] datain_parallel=0;//待解码数据转并行暂存
reg [8:1] outbuf_parallel=0;//解码后输出并行数据暂存
reg [4:0] count=0;
reg d_finish=0;//数据输入完毕指示
reg c_finish=0;//解码完毕指示
reg clk2=0;//分频时钟
integer i,j,k=8;
//本进程用来串并转换
always @ (posedge clk)//解码的时候是输入比输出多,所以输入用未分频的时钟,输出用分频了的
begin
count=count+1;
if(count==17)
begin
count<=16;
d_finish<=1;//16bit数据输入完毕啦可以开始解码了喵
end
else
begin
datain_parallel<={datain_parallel[15:1],signal_in};
end
end
//本进程用来产生2分频
always @ (posedge clk)
begin
clk2<=~clk2;
end
//本进程用来并串转换
always @ (posedge clk2)
begin
if(c_finish==1)//解码完毕,可以输出鸟
begin
o_start=1;
signal_out<=outbuf_parallel[k];
k<=k-1;
if(k==0)//数据输出完毕
begin
o_finish=1;
signal_out<=0;
end
end
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=839
1247