完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
robei.cn注册后下载Robei软件,前500名注册免费赠送市场标价2W元的注册码一个,目前还有200个名额,机会不多,不要错过。一分钟注册成功,一分钟下载成功(Robei大小不足5M),多款软件多个方法,各位发烧友友们不要错过,赶紧去注册吧。
跟多精彩等着你。 |
|
相关推荐
|
|
欢迎大家注册 注册码还剩下100+
|
|
|
|
|
|
不错的资料,谢谢分享。。。。。。。。。。。
|
|
|
|
|
|
今晚7点半准时开展在线讲座
|
|
|
|
|
|
还剩下50个免费注册码 每注册的朋友抓紧时间啦
|
|
|
|
|
|
还没注册的朋友赶紧注册啦
|
|
|
|
|
|
Verilog HDL 之 AD转换
AD转换就是模数转换,顾名思义,就是把模拟信号转换成数字信号。我们所用的模数转换芯片是ADC0809。 ADC0809 8通道8位a/d转换器,ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。它是逐次逼近式A/D转换器,可以和单片机直接接口。ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。如图3.1所示。 图3.1 ADC0809的内部结构和引脚定义 如何学会使用一个自己曾经没有用过的芯片,最重要的是要学会看它的芯片手册,以及它的时序图。下面我们将看看是如何根据它的时序图完成对芯片的驱动的。 图3.2 ADC0809时序图 原理(好好理解一下,这样才能很好的根据时序图写出代码。):START为转换启动信号。当START上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,START应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OUTPUTENABLE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。D7-D0为数字量输出线。CLK为时钟输入信号线。因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ(程序中会有体现)。 Verilog HDL实现 实现步骤请参照 FPGA Verilog HDL 设计实例系列连载--------8-3编码器 设计文件输入Verilog HDL代码。 //------------------------------------------------------------------------------------------------- // // File : ADC0809.v // Generated : 2011-07-21 // Author : wangliang // //------------------------------------------------------------------------------------------------- `timescale 1 ns / 1 ps module ADC0809 ( seven_seg ,ale ,OE ,D ,EOC ,clk ,abc_in ,abc_out ,start ,rst ); input clk ; //系统时钟 input [2:0] abc_in ; //外部控制的通道选择信号 input [7:0] D ; //ADC0809传进来的数据 input EOC ; //ADC0809转换完成信号标志 input rst ; //系统 复位 output [15:0] seven_seg ; //FPGA给数码管的数据 output ale ; //FPGA给ADC0809的地址锁存信号 output OE ; //FPGA给ADC0809的使能信号 output [2:0] abc_out ; //FPGA给ADC0809的通道选择信号 output start ; //ADC0809 转换开始信号 parameter st0 = 3'b000, st1 = 3'b001, st2 = 3'b010, st3 = 3'b011, st4 = 3'b100, st5 = 3'b101, st6 = 3'b110 ; reg [2:0] p_state ; reg [2:0] n_state ; reg ale_r ; reg OE_r ; reg start_r ; reg [7:0] reg1 ; reg [7:0] qq ; wire [2:0] state ; assign state = p_state ; always @ (posedge clk or negedge rst) begin if ( rst== 1'b0 ) begin p_state <= st0 ; qq <= 8'b0 ; end else begin qq <= qq + 1'b1; if ( ( qq >= 8'b0100_0010) && ( clk == 1'b1 ) ) begin qq <= 8'b0; p_state <=#1 n_state; end end end assign ale = ale_r ; assign OE = OE_r ; assign start = start_r ; assign abc_out = abc_in ; always @ ( EOC ,p_state ) begin case ( p_state ) st0 :begin ale_r <= #1 1'b0; start_r <= #1 1'b0; OE_r <= #1 1'b0; n_state <=#1 st1; end st1 :begin ale_r <= #1 1'b1; start_r <= #1 1'b0; OE_r <= #1 1'b0; n_state <=#1 st2; end st2 :begin ale_r <= #1 1'b0; start_r <= #1 1'b1; OE_r <= #1 1'b0; n_state <=#1 st3; end st3 :begin ale_r <= #1 1'b0; start_r <= #1 1'b0; OE_r <= #1 1'b0; if ( EOC == 1'b1 ) n_state <=#1 st3; else n_state <=#1 st4; end st4 :begin ale_r <= #1 1'b0; start_r <= #1 1'b0; OE_r <= #1 1'b0; if ( EOC == 1'b0 ) n_state <=#1 st4; else n_state <=#1 st5; end st5 :begin ale_r <= #1 1'b0; start_r <= #1 1'b0; OE_r <= #1 1'b1; n_state <=#1 st6; end st6 :begin ale_r <= #1 1'b0; start_r <= #1 1'b0; OE_r <= #1 1'b1; reg1 <=#1 D ; n_state <=#1 st0; end default :begin ale_r <= #1 1'b0; start_r <= #1 1'b0; OE_r <= #1 1'b0; n_state <=#1 st0; end endcase end /******************** 数码管显示译码部分 ***********************************/ reg [7:0] Y_r_1; reg [7:0] Y_r_2; assign seven_seg[7:0] ={1'b1,(~Y_r_1[6:0])}; assign seven_seg[15:8] = {1'b1,(~Y_r_2[6:0])}; always @(reg1[3:0] ) begin Y_r_1 = 7'b1111111; case (reg1[3:0] ) 4'b0000: Y_r_1 = 7'b0111111; // 0 4'b0001: Y_r_1 = 7'b0000110; // 1 4'b0010: Y_r_1 = 7'b1011011; // 2 4'b0011: Y_r_1 = 7'b1001111; // 3 4'b0100: Y_r_1 = 7'b1100110; // 4 4'b0101: Y_r_1 = 7'b1101101; // 5 4'b0110: Y_r_1 = 7'b1111101; // 6 4'b0111: Y_r_1 = 7'b0000111; // 7 4'b1000: Y_r_1 = 7'b1111111; // 8 4'b1001: Y_r_1 = 7'b1101111; // 9 4'b1010: Y_r_1 = 7'b1110111; // A 4'b1011: Y_r_1 = 7'b1111100; // b 4'b1100: Y_r_1 = 7'b0111001; // c 4'b1101: Y_r_1 = 7'b1011110; // d 4'b1110: Y_r_1 = 7'b1111001; // E 4'b1111: Y_r_1 = 7'b1110001; // F default: Y_r_1 = 7'b0000000; endcase end always @( reg1[7:4] ) begin Y_r_2 = 7'b1111111; case ( reg1[7:4] ) 4'b0000: Y_r_2 = 7'b0111111; // 0 4'b0001: Y_r_2 = 7'b0000110; // 1 4'b0010: Y_r_2 = 7'b1011011; // 2 4'b0011: Y_r_2 = 7'b1001111; // 3 4'b0100: Y_r_2 = 7'b1100110; // 4 4'b0101: Y_r_2 = 7'b1101101; // 5 4'b0110: Y_r_2 = 7'b1111101; // 6 4'b0111: Y_r_2 = 7'b0000111; // 7 4'b1000: Y_r_2 = 7'b1111111; // 8 4'b1001: Y_r_2 = 7'b1101111; // 9 4'b1010: Y_r_2 = 7'b1110111; // A 4'b1011: Y_r_2 = 7'b1111100; // b 4'b1100: Y_r_2 = 7'b0111001; // c 4'b1101: Y_r_2 = 7'b1011110; // d 4'b1110: Y_r_2 = 7'b1111001; // E 4'b1111: Y_r_2 = 7'b1110001; // F default: Y_r_2 = 7'b0000000; endcase end endmodule 复制代码 上面一长串代码,刚接触的人一看可能会头大,但要是仔细分析一下,就会很好理解了。本实现有三部分组成: 1.第44行~第59行:时钟分频,系统时钟为50MHZ,ADC0809的驱动频率不需要这么快,所以需要分频。一般在500KHZ左右,实例中用的是750KHz。 2.第67行~第128行:对ADC0809时序的实现。自己好好理解下哦。一次模数转换经过6个步骤完成。第3步和第4步需要查看EOC的状态来确定是否将模拟数据转换完毕。 3.第137行~第183行:将模拟数据转化到的数字数据输出到2个数码管上。图3.3是ADC0809的外部接口。 图3.3 ADC0809的外部接口 分配引脚: clk接系统时钟,rst接复位信号,abc_in[2..0]接三个按键,seven_seg[15..0]接2个七段数码管,其余的是ADC0809上的型号,这是由硬件连线决定的,只要搞清楚它们是输入还是输出就行了。实验结果: 将三个按键都关闭,选择0通道,这样,当旋转按钮的时候,在2个七段数码管上就能显示数值。这就完成了将模拟数据转化为数字量的验证。 |
|
|
|
|
|
1413 浏览 1 评论
1208 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
1419 浏览 0 评论
913 浏览 0 评论
2223 浏览 0 评论
1424 浏览 34 评论
5610 浏览 113 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 01:18 , Processed in 0.525892 second(s), Total 51, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号