数字电路实验三:数字电压表(设计报告) 下载本文

数电实验3设计报告

实验名称:数字电表

实验目的:

1.掌握组合逻辑与时序逻辑电路的设计方法及调试方法 2.熟练掌握常用MSI逻辑芯片的功能及使用方法 3.初步掌握Verilog HDL数字系统设计方法

4.熟悉PLD实验箱的结构和使用及Quartus II软件的基本操作 5.掌握采用Quartus II软件和实验箱设计实现逻辑电路的基本过程

设计任务及要求:

1、利用FPGA 与ADC0809 设计一个数字电压表,能够测量0-5V 之间

的直流电压值,四位数码显示。

2、在实验电路板上焊接插座,将ADC0809 安装在插座上。

3、选择一路模拟量输入通道(如:IN0),经可调电位器送入0-5V 的直

流电压。

4、ADC0809 时序由FPGA 控制,ADC 转换输出的数字量(D7-D0)送

回FPGA,转换结果由实验箱上的LED 数码管以十进制形式显示。

5、ADC0809 的VREF 接+5V 电压。

6、FPGA 与ADC0809 之间接口利用实验箱上的“彩色液晶”接口。

程序设计过程:

1、 定义程序名、输入输出量和初始化

Moduleadc_cc(clkin,rst,clkout,sel,data,start,eoc,ale,oe,seg_com,seg_data);

input clkin; //时钟输入50MHZ inputrst;

inputeoc; //ADC0809

input [7:0] data; //输入八位数据

output clkout; //时钟输出

output start; //ADC0809起始信号 output [2:0] sel; //转换通道 output ale; //ADC0809 outputoe; //ADC0809 output [7:0] seg_com; //位选 output [7:0] seg_data; //段选

parameter CLK_FREQ = 'D50_000_000;//系统时钟50MHZ parameter CLK_out_FREQ = 'D500_000;//输出时钟

parameter state_pre = 0; //sel 状态1

parameter state_pre2 = 1; //ale 状态2 parameter state_start = 2; //start 状态3 parameter state_conv = 3; //conv 状态4 parameter state_wait = 4; // 状态5 parameter state_readpre = 5; // 状态6 parameter state_read = 6;//over // 状态7

reg [2:0] sel; //定义寄存器 reg ale; //定义寄存器 reg start; //定义寄存器 regoe; //定义寄存器

reg [7:0] data_led; //LED显示数据 reg [31:0] DCLK_DIV; //32位计数器

regclkout; //提供ADC0809时钟500KHZ reg [3:0] state = state_pre;

2、 按照PDF所给出的时序图进行编程

对照时序图,使ADC0809按上图方式工作进行编程

always @ (negedgeclkout) case (state) state_pre : begin sel[2:0] <= 'b000; //ABC 000 通道0 state <= state_pre2; //转到状态2 oe<= 0; //OE拉低 end state_pre2 : begin ale <= 1; state <= state_start; end state_start : begin start <= 1; ale<= 0; state <= state_conv; end state_conv : begin ale <= 0; start <= 0; state <= state_wait; end state_wait : begin if(eoc) begin state <= state_readpre; end end state_readpre : begin oe<= 1; state <= state_read; end state_read : begin data_led = data; state <= state_pre; end endcase

//ALE拉高 //转到状态3 //START拉高 //转到状态4 //ALE拉低锁定 //START拉低 AD启动 //转到状态5 //查询EOC是否被拉高 //转到状态6 //输出使能拉高 //转到状态7 //开始读数据 //重新回到状态1 进行下一次AD转换 3、 将AD转换结果用数码管显示。包括扫描模块和数码管译码模块两部分,输出8位位选和8为片选信号。

数码管译码器程序: moduleled_8 (A, LED7S); input [3:0] A; output [6:0] LED7S; reg [6:0] LED7S; always @(A) begin case(A) 4'b0000 : LED7S<=7'b0111111; 4'b0001: LED7S <= 7'b0000110 ; 4'b0010: LED7S <= 7'b1011011; 4'b0011: LED7S <= 7'b1001111; 4'b0100: LED7S <= 7'b1100110 ; 4'b0101: LED7S <= 7'b1101101; 4'b0110: LED7S <= 7'b1111101 ; 4'b0111: LED7S <= 7'b0000111 ; 4'b1000: LED7S <= 7'b1111111 ; 4'b1001: LED7S <= 7'b1101111 ; 4'b1010: LED7S <= 7'b1110111 ; 4'b1011: LED7S <= 7'b1111100 ; 4'b1100: LED7S <= 7'b0111001 ; 4'b1101: LED7S <= 7'b1011110 ; 4'b1110: LED7S <= 7'b1111001 ; 4'b1111: LED7S <= 7'b1110001 ; endcase end endmodule

4、分频模块,将试验箱自带的50MHZ时钟信号分频给扫描模块。

always @(posedgeclkin)

if(DCLK_DIV < (CLK_FREQ / CLK_out_FREQ)) DCLK_DIV <= DCLK_DIV+1'b1; else begin

DCLK_DIV <= 0; clkout<= ~clkout; end

扫描模块程序 modulesaomiao (x,y,a,clk,led0,led1); inputclk; input[6:0] x,y; output[6:0] a; output led0,led1; reg[6:0] a; reg led0,led1; always @(clk,x,y) if(clk) begin a=x; led0=1; led1=0; end else begin a=y; led1=1; led0=0; end endmodule 设计原理图:

以及目标时序图:

程序封装后可以更清晰 了解输入输出以及功能

adc_cc

clkinclkout rstsel[2..0]data[7..0]start

eocale oe seg_com[7..0]seg_data[7..0]

instParameterCLK_FREQCLK_out_FREQstate_prestate_pre2state_startstate_convstate_waitstate_readprestate_readValue00000010111110101111000010000000000000000000011110100001001000000123456TypeUnsigned BinaryUnsigned BinarySigned IntegerSigned IntegerSigned IntegerSigned IntegerSigned IntegerSigned IntegerSigned Integer

管脚分配: