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