名称:基于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
956