基于Verilog的密勒码编译码器设计

更新时间:2023-08-11 13:31:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

使用Verilog语言实现密勒码编译码器设计,课程实验。

实验三 基于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; //编码数据输出完毕指示

//内部变量声明

reg [7:0] datain_parallel=0; //待编码数据转并行暂存

reg [15:0] outbuf_parallel=0; //编码后输出并行数据暂存

reg [3:0] count=0;

reg d_finish=0; //数据输入完毕指示

reg c_finish=0; //编码完毕指示

reg clk2=0; //分频时钟

integer i,k=15;

//本进程用来串并转换

always @ (posedge clk2)//输入用clk的二分频时钟,来保证时间相等

begin

count=count+1;

if(count==9)

begin

count<=8;

d_finish<=1; //串行数据输入完毕,可以开始计算了

end

else

begin

datain_parallel<={datain_parallel[6:0],signal_in};

end

end

//本进程用来产生2分频

always @ (posedge clk)

使用Verilog语言实现密勒码编译码器设计,课程实验。

begin

clk2<=~clk2;

end

//本进程用来并串转换,因为老师说输入输出都得是串行且时间相等

always @ (posedge clk) //输出用clk时钟

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

else

begin

signal_out<=0;

end

end

always @(posedge clk2)

begin

if(d_finish==1)//当串行数据全输入完毕,才开始计算。

begin

case(datain_parallel[7:6])

2'b00:outbuf_parallel[15:12] = 4'b0011;

2'b01:outbuf_parallel[15:12] = 4'b0001;

2'b10:outbuf_parallel[15:12] = 4'b0111;

2'b11:outbuf_parallel[15:12] = 4'b0110;

default:outbuf_parallel[15:12] = 4'b0000;

endcase

for(i = 5;i >= 0; i = i-1)

case(datain_parallel[i])

'b1:

begin

case(datain_parallel[i+1])

'b1:

begin

case({outbuf_parallel[2*i+3],outbuf_parallel[2*i+2]})

2'b10:{outbuf_parallel[2*i+1],outbuf_parallel[2*i]} = 2'b01;

使用Verilog语言实现密勒码编译码器设计,课程实验。

2'b01:{outbuf_parallel[2*i+1],outbuf_parallel[2*i]} = 2'b10; endcase end 'b0: begin case({outbuf_parallel[2*i+3],outbuf_parallel[2*i+2]}) 2'b00:{outbuf_parallel[2*i+1],outbuf_parallel[2*i]} = 2'b01; 2'b11:{outbuf_parallel[2*i+1],outbuf_parallel[2*i]} = 2'b10; endcase end endcase end 'b0: begin case(datain_parallel[i+1]) 'b1: begin case({outbuf_parallel[2*i+3],outbuf_parallel[2*i+2]}) 2'b10:{outbuf_parallel[2*i+1],outbuf_parallel[2*i]} = 2'b00; 2'b01:{outbuf_parallel[2*i+1],outbuf_parallel[2*i]} = 2'b11; endcase end 'b0: begin case({outbuf_parallel[2*i+3],outbuf_parallel[2*i+2]}) 2'b00:{outbuf_parallel[2*i+1],outbuf_parallel[2*i]} = 2'b11; 2'b11:{outbuf_parallel[2*i+1],outbuf_parallel[2*i]} = 2'b00; endcase end endcase end endcase c_finish=1;//计算完毕了,可以考虑输出的问题了~ end

使用Verilog语言实现密勒码编译码器设计,课程实验。

endmodule

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; //解码数据输出完毕指示

//内部变量声明

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;

使用Verilog语言实现密勒码编译码器设计,课程实验。

//本进程用来并串转换

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

else

begin

signal_out<=0;

end

end

//本进程用来解码计算思密达

always @(posedge clk)

begin

if(d_finish==1) //串并转换完毕

begin

for(i = 16;i >= 3;i = i - 2)

case({datain_parallel[i],datain_parallel[i-1]})

2'b00:

outbuf_parallel[i/2]=2'b0;

2'b01:

outbuf_parallel[i/2]=2'b1;

2'b10:

outbuf_parallel[i/2]=2'b1;

2'b11:

outbuf_parallel[i/2]=2'b0;

endcase

case ({datain_parallel[2],datain_parallel[1]})

2'b00:

outbuf_parallel[i/2] = 2'b0;

2'b01:

outbuf_parallel[i/2] = 2'b1;

2'b10:

outbuf_parallel[i/2] = 2'b1;

使用Verilog语言实现密勒码编译码器设计,课程实验。

2'b11:

outbuf_parallel[i/2] = 2'b0;

endcase

c_finish=1;

end

end

endmodule

二、 仿真验证

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时钟来控制输入数据一位一位往里进哟

使用Verilog语言实现密勒码编译码器设计,课程实验。

begin

signal_in=shift[0];

temp=shift[0];

shift=shift>>1;

shift[7]=temp;

end

//检测输出信号

initial

begin

$monitor($time,"signal_out=%b

o_finish= %b",signal_out,o_start,o_finish);

#8000 $finish;

end

endmodule o_start=%b

仿真结果如下图所示

2. 译码器仿真验证

//miller_decoder程序的测试程序

`timescale 10ns/1ns

module miller_decoder_tb;

//主要输入寄存器

reg clk;

reg clk2;

reg signal_in;

//主要输出声明

wire signal_out;

wire o_start;

使用Verilog语言实现密勒码编译码器设计,课程实验。

wire o_finish;

reg temp;

reg [15:0] shift;

//待测试设计例化

miller_decoder my_miller_decoder(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'b1110001110000110;

signal_in=shift[0];

temp=shift[0];

shift=shift>>1;

shift[15]=temp;

end

always @(posedge clk) //注意这里是clk时钟来控制输入数据一位一位往里进哟 begin

signal_in=shift[0];

temp=shift[0];

shift=shift>>1;

shift[15]=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

仿真结果如下图所示。

使用Verilog语言实现密勒码编译码器设计,课程实验。

本文来源:https://www.bwwdw.com/article/754j.html

Top