基于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语言实现密勒码编译码器设计,课程实验。
正在阅读:
基于Verilog的密勒码编译码器设计08-11
先进班集体申请书(通用10篇)03-23
在全市老干部座谈会上的讲话09-09
2014年八月份企业人力资源管理师三级最新考试题库(完整版)04-17
发现、体验、创造生活中的“数学美”08-06
在全区消防工作座谈会上的讲话09-07
《周恩来的四个昼夜》观后感04-02
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 密勒
- 译码器
- 基于
- Verilog
- 设计
- 小学生硬笔书法作品展示(已排版精美稿纸)
- 如何做好高中班主任工作 李红梅
- 对学校工作建议和意见
- 高等数学练习册第八章
- 材料工艺学(物料输送和混合)第4章1
- 1Cr5Mo管施工方案
- 光合作用和呼吸作用的图解
- 如何做好微商?微商怎么作?微商怎么加人?
- 第一章 货币与货币制度答案
- Video Google-A Text Retrieval Approach to Object Matching in Videos
- 钣金结构件可加工性设计规范-华为
- 股份制银行年报解读:利润增速放缓经营依然稳健
- 2020-2021学年四川省遂宁二中高二上学期半期考试数学(理)试题 word版
- 金隅大成九棵树地块周边调研0317
- 哪里可以办理电池MSDS报告?
- 列王的纷争技能怎么加点?技能加点分析攻略
- 薪酬管理制度编制说明
- 硝苯地平缓释片、马来酸依那普利片和富马酸比索洛尔片对Ⅰ级高血压患者24 h血压的影响-论文
- 进口过氧化氢H2O2传感器
- 空间缆索悬索桥的主缆线形分析_罗喜恒