基于Verilog HDL 的数字电压表设计
本次实验是在“基于Verilog HDL的ADC0809CCN数据采样”实验上进一步改进,利用ADC0809采集到的8位数据,进行BCD编码,以供查表方式相加进行显示,本次实验用三位数码管。
ADC0809的8位数数据BCD编码方式,低四位与高四位分开进行编码,其对应值我也是从网上得来的,具体对应值请看代码,编完码得到12位宽的数据后,对两个编码进行相加,如代码中的cout[11:0] = L[11:0] + H[11:0],这里注意,高四位[11:8]、中四位[7:4]、低四位[3:0]。
假如ADC0809得到的数据是8'hb4,从代码中可以看到,低四位4'h4: L <= 12'h008;高四位4'hb: H <= 12'h352;,H+L = 12’h35A,低位为A,大于9,向中位产生进位C0= 1,其低位得加6得到0,故cout[11:0]=12'h360,电压也就是3.60V,然后把360送给数码管进行显示。同理如果中位相加大于9也得向高位进位C1,此时的中位要变为加6后的值。
代码实现:
display_control.v
module display_control(
//input
sys_clk,//27MHZ
rst_n,
seg_data,//ADC0809传送进来的数据 //output
slec_wei,
slec_duan
);
input rst_n;
input [:] seg_data;
input sys_clk; output [:] slec_wei;
output [:] slec_duan; /*****************************************/
parameter SEG_NUM0 = 'h3f,
SEG_NUM1 = 'h06,
SEG_NUM2 = 'h5b,
SEG_NUM3 = 'h4f,
SEG_NUM4 = 'h66,
SEG_NUM5 = 'h6d,
SEG_NUM6 = 'h7d,
SEG_NUM7 = 'h07,
SEG_NUM8 = 'h7f,
SEG_NUM9 = 'h6f,
SEG_NUMa = 'h77,
SEG_NUMb = 'h7c,
SEG_NUMc = 'h39,
SEG_NUMd = 'h5e,
SEG_NUMe = 'h79,
SEG_NUMf = 'h71;
parameter T5MS = 'd134_999;
/************************************/
//低四位BCD编码
reg [:] L;
always @ (posedge sys_clk)
case(seg_data[:]) //L = n * 12'h002(n=1、2、3、、f)
'h1: L <= 12'h002;
'h2: L <= 12'h004;
'h3: L <= 12'h006;
'h4: L <= 12'h008;
'h5: L <= 12'h010;
'h6: L <= 12'h012;
'h7: L <= 12'h014;
'h8: L <= 12'h016;
'h9: L <= 12'h018;
'ha: L <= 12'h020;
'hb: L <= 12'h022;
'hc: L <= 12'h024;
'hd: L <= 12'h026;
'he: L <= 12'h028;
'hf: L <= 12'h030;
default : L <= 'h000;
endcase
/************************************/
//高四位BCD编码
reg [:] H;
always @ (posedge sys_clk)
case(seg_data[:]) //H = n * 12'h032(n=1、2、3、、f)
'h1: H <= 12'h032; //12'b0000_0011_0010;
'h2: H <= 12'h064; //12'b0000_0110_0100;
'h3: H <= 12'h096; //12'b0000_1001_0110;
'h4: H <= 12'h128; //12'b0001_0010_1000;
'h5: H <= 12'h160; //12'b0001_0110_0000;
'h6: H <= 12'h192; //12'b0001_1001_0010;
'h7: H <= 12'h224; //12'b0010_0010_0100;
'h8: H <= 12'h256; //12'b0010_0101_0110;
'h9: H <= 12'h288; //12'b0010_1000_1000;
'ha: H <= 12'h320; //12'b0011_0010_0000;
'hb: H <= 12'h352; //12'b0011_0101_0010;
'hc: H <= 12'h384; //12'b0011_1000_0100;
'hd: H <= 12'h416; //12'b0100_0001_0110;
'he: H <= 12'h448; //12'b0100_0100_1000;
'hf: H <= 12'h480; //12'b0100_1000_0000;
default : H <= 'h000; //12'b0000_0000_0000;
endcase
/************************************/
//判断低四位是否大于9并进位
reg c0;
always @ (posedge sys_clk)
begin
if(H[:] + L[:] > 'd9)
c0 <= ;
else
c0 <= ;
end
/************************************/
//判断中间四位是否大于9并进位
reg c1;
always @(posedge sys_clk)
begin
if(H[:] + L[:] > 'd9)
c1 <= ;
else
c1 <= ;
end
/***********************************************/
//对进位进行计算,中四位减去2,低四位加上1,是为了校准显示电压与实测电压更为接近,根据情况而定
reg [:] cout;
always @(c1 or c0)
begin
case({c1,c0})
'b00: begin
cout[:] <= H[:] + L[:];
cout[:] <= H[:] + L[:] - 'd2;//减去4'd2是为了校准显示电压,与实际测试更为接近
cout[:] <= H[:] + L[:] + 'd1;//减去1'd1是为了校准显示电压,与实际测试更为接近
end 'b01: begin
if((H[:] + L[:] + 'b0001) > 9) begin
cout[:] <= H[:] + L[:] + 'b0001;
cout[:] <= H[:] + L[:] + 'b0111 - 4'd2;//加上6并加上来自低位上的进位
cout[:] <= H[:] + L[:]+ 'b0110 + 1'd1;//加上6
end
else begin
cout[:] <= H[:] + L[:];
cout[:] <= H[:] + L[:] + 'b0001 - 4'd2;
cout[:] <= H[:] + L[:] + 'b0110 + 1'd1;
end
end 'b10:begin
cout[:] <= H[:] + L[:] + 'b0001;
cout[:] <= H[:] + L[:] + 'b0110 - 4'd2;
cout[:] <= H[:] + L[:] + 'd1;
end 'b11:begin
cout[:] <= H[:] + L[:] + 'b0001;
cout[:] <= H[:] + L[:] + 'b0110 - 4'd2;
cout[:] <= H[:] + L[:] + 'b0110 + 1'd1;
end
endcase
end /**********************************************/
//5ms计数器
reg [:] cnt;
always @(posedge sys_clk or negedge rst_n)
if(!rst_n)
cnt <= 'd0;
else if(cnt == T5MS)
cnt <= 'd0;
else
cnt <= cnt + 'b1;
/**********************************************/
//通过移位方式进行流水工作,定时开关
reg [:] slec_wei_temp;
always @(posedge sys_clk or negedge rst_n)
if(!rst_n) begin
slec_wei_temp <= 'd011;
end
else if(cnt == T5MS) begin
if(slec_wei_temp == 'b110)
slec_wei_temp <= 'b011;
else
slec_wei_temp <= {'b1,slec_wei_temp[2:1]};
end assign slec_wei = {'b1,slec_wei_temp};
/*****************************************/
reg [:] data0;
always @ (posedge sys_clk)
case(cout[:]) //进行编码 高
'h0: data0 <= SEG_NUM0;
'h1: data0 <= SEG_NUM1;
'h2: data0 <= SEG_NUM2;
'h3: data0 <= SEG_NUM3;
'h4: data0 <= SEG_NUM4;
'h5: data0 <= SEG_NUM5;
'h6: data0 <= SEG_NUM6;
'h7: data0 <= SEG_NUM7;
'h8: data0 <= SEG_NUM8;
'h9: data0 <= SEG_NUM9;
default:data0 <= SEG_NUM0;
endcase
/*****************************************/
reg [:] data1;
always @ (posedge sys_clk)
case(cout[:]) //进行编码 中
'h0: data1 <= SEG_NUM0;
'h1: data1 <= SEG_NUM1;
'h2: data1 <= SEG_NUM2;
'h3: data1 <= SEG_NUM3;
'h4: data1 <= SEG_NUM4;
'h5: data1 <= SEG_NUM5; 'h6: data1 <= SEG_NUM6;
'h7: data1 <= SEG_NUM7;
'h8: data1 <= SEG_NUM8;
'h9: data1 <= SEG_NUM9;
default:data1 <= SEG_NUM0;
endcase
/*****************************************/
reg [:] data2;
always @ (posedge sys_clk)
case(cout[:]) //进行编码 低
'h0: data2 <= SEG_NUM0;
'h1: data2 <= SEG_NUM1;
'h2: data2 <= SEG_NUM2;
'h3: data2 <= SEG_NUM3;
'h4: data2 <= SEG_NUM4;
'h5: data2 <= SEG_NUM5;
'h6: data2 <= SEG_NUM6;
'h7: data2 <= SEG_NUM7;
'h8: data2 <= SEG_NUM8;
'h9: data2 <= SEG_NUM9;
default:data2 <= SEG_NUM0;
endcase
/***********************************************/
reg [:] num;
always @ (posedge sys_clk or negedge rst_n)
if(!rst_n)
num <= 'd0;
else if(cnt == T5MS)
num <= num + 'b1;
else if(num == 'd3)
num <= 'd0;
/***********************************************/
reg [:] slec_duan;
always @ (posedge sys_clk)
case(num)
'd0: slec_duan <= data0;
'd1: slec_duan <= data1;
'd2: slec_duan <= data2;
endcase endmodule
adc0809_control.v模块和adc0809_top模块请看基于Verilog HDL的ADC0809CCN数据采样中的代码。
当代码写完之后,发现显示的数据与实际电压有点偏差,高了0.2V左右,后来我测试了一下ADC0809的工作电压是4.8V,不是5V,我想可能是因为跟这个参考电压有关,为了让显示的数据与实际测试尽量接近,可以在代码中进行校准,我在中四位cout[7:4]减2,低cout[3:0]加1,其结果还是比较接近实际值。
基于Verilog HDL 的数字电压表设计的更多相关文章
- 基于Verilog HDL整数乘法器设计与仿真验证
基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为 ...
- 基于Verilog HDL 各种实验
菜鸟做的的小实验链接汇总: 1.基于Verilog HDL 的数字时钟设计 2.乘法器 3.触发器(基本的SR触发器.同步触发器.D触发器) 4.基于Verilog HDL的ADC ...
- 基于Verilog HDL 的数字时钟设计
基于Verilog HDL的数字时钟设计 一.实验内容: 利用FPGA实现数字时钟设计,附带秒表功能及时间设置功能.时间设置由开关S1和S2控制,分别是增和减.开关S3是模式选择:0是正常时钟 ...
- 基于Verilog HDL的超前进位全加器设计
通常我们所使用的加法器一般是串行进位,将从输入的ci逐位进位地传递到最高位的进位输出co,由于电路是有延迟的,这样的长途旅行是需要时间的,所以为了加快加法器的运算,引入了超前进位全加器. 全加器的两个 ...
- paper:基于verilog HDL 的高速可综合FSM设计
1.寄存器输出型状态机 VS 组合逻辑输出型状态机 2.状态编码方法 这块讲的不好,也比较少. 3.系统设计中模块划分的指导性原则
- 基于Verilog语言的可维护性设计技术
[注]本文内容主体部分直接翻译参考文献[1]较多内容,因此本文不用于任何商业目的,也不会发表在任何学术刊物上,仅供实验室内部交流和IC设计爱好者交流之用. “曲意而使人喜,不若直节而使人忌:无善而致人 ...
- 基于Verilog HDL的二进制转BCD码实现
在项目设计中,经常需要显示一些数值,比如温湿度,时间等等.在数字电路中数据都是用二进制的形式存储,要想显示就需要进行转换,对于一个两位的数值,对10取除可以得到其十位的数值,对10取余可以得到个位的数 ...
- 基于Verilog HDL的ADC0809CCN数据采样
本实验是用ADC0809CCN进行数据采样,并用7段数码管进行显示. ADC0809由一个8路模拟开关.一个地址锁存与译码器.一个A/D转换器和一个三态输出锁存器组成.多路开关可选通8个模拟通道,允许 ...
- 基于Verilog的奇数偶数小数分频器设计
今天呢,由泡泡鱼工作室发布的微信公共号“硬件为王”(微信号:king_hardware)正式上线啦,关注有惊喜哦.在这个普天同庆的美好日子里,小编脑洞大开,决定写一首诗赞美一下我们背后伟大的团队,虽然 ...
随机推荐
- json 数组 对象 xml 之间转换(待补充)
json 数组 xml 对象 之间转换(待补充) 1 把对象的类型或者数组转换成字符串类型(或者更确切的说是json类型的). 此处参考链接http://www.jb51.net/article ...
- shell之路【第二篇】运算与文件调用
Bash 支持很多运算符,包括算数运算符.关系运算符.布尔运算符.字符串运算符和文件测试运算符. 原生bash不支持简单的数学运算,默认都是字符串操作,但是可以通过其他命令来实现 算数运算 expr. ...
- The project target (Android 6.0) was not properly loaded或者The rendering target (Android 6.0) is still loading.
第一步:在project上右键选择Properties,然后选择Android, 然后在Project Build Target那里选择其他的Target试试: 第二步: 我选了6.0之后,就有菜单可 ...
- 安卓四大组件的作用、安卓Service的作用
Activity好像是应用程式的眼睛,提供与user互动之窗. BroadcastReceiver好像是耳朵,接收来自各方的Intent. Service是在后台运行的. 一个Service 是一段长 ...
- table导出到excel的两种方法
1. 用table2excel 的js文件,这种方法没有IE兼容性 需要在文件中导入 <script type="text/javascript" src="< ...
- include和 merge
include和merge标记的作用主要是为了解决layout的重用问题. 比如我们有三四个Activity但是他们都要用到同一个样式的标题栏,虽然我们把一样的代码copy个三四遍也没关系,但实在是太 ...
- Delphi XE2 生成的.exe 在未安装有Delphi的电脑上运行提示 “丢失 rtl160.bpl”
解决方案: XE2中加入了多平台的概念,默认的Release模式,也是带包编译,带运行时库的,所以,需要手工设置一下工程选项: 打开工程以后,Project-->Options-->左侧树 ...
- 网址组成与特殊ip小解
网址 https://www.baidu.com:8010/a/html/a.html?tn=monline_3_dg#part1 注解: 网址= 当前url协议+域名+端口号+路径名+参数+hash ...
- ignite通过注解配置查询
官方文档的叙述可能有些不清楚,我做了一个测试,并且可以成功运行,待会儿后面贴出小栗子. 两步操作: 第一步在属性值处贴上@QuerySqlField注解 第二部设置key和value类型 Person ...
- Gym 100917L Liesbeth and the String 规律&&胡搞
题目: Description standard input/outputStatements Little Liesbeth likes to play with strings. Initiall ...