数电实验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
管脚分配: