用VHDL语言设计一个AD转换程序,AD转换芯片采用TLC549

用VHDL语言设计一个AD转换程序,AD转换芯片采用TLC549,第1张

这是个我一直用的代码,没问题。就是是VERILOG的,你自己改改吧

/**************************************************************************************************

** TLC549 AD转换器 verilog代码

**************************************************************************************************/

moduleadc(

clk,

rst_n,

adc_clk,

adc_data,

adc_cs_n,

rAdc_data

)

inputclk // 50MHz输入时钟

inputrst_n // 复位信号,低有效

input adc_data // ADC芯片输出的数据

output adc_clk // ADC芯片输入时钟

output adc_cs_n // ADC芯片片选信号,低有效

output[7:0]rAdc_data

reg start_adc

/*************************************************************************************************/

reg[10:0] clk_cnt // clk计数器

wire cs_n_valid1

wire cs_high

wire cs_n_valid2

always @(posedge clk or negedge rst_n)

if (!rst_n)

begin clk_cnt <= 11'd0start_adc<=1end

else if (start_adc)

clk_cnt <= clk_cnt + 1'b1

/*

** 完成一次转换需要75+8*64+850+75+8*64=2024个时钟周期

** adc_cs_n建立时间为75个时钟周期1.5us 转换时间保持高电平17us,即850个时钟周期

** adc_clk周期为系统时钟的64倍

*/

assign cs_n_valid1 = (clk_cnt >11'd74) &&(clk_cnt <= 11'd587)

assign cs_high= (clk_cnt >11'd587) &&(clk_cnt <= 11'd1437)

assign cs_n_valid2 = (clk_cnt >11'd1512) &&(clk_cnt <= 11'd2024)

//=================================================================================================

regrAdc_cs

always@(posedge clk or negedge rst_n)

if (!rst_n)

rAdc_cs <= 1'b1

else if (start_adc) begin

rAdc_cs <= 1'b0

if (cs_high)

rAdc_cs <= 1'b1

else

rAdc_cs <= 1'b0

end

assign adc_cs_n = rAdc_cs

//=================================================================================================

reg [5:0] div_cnt // 64分频计数器

reg rAdc_clk

always @(posedge clk or negedge rst_n)

if (!rst_n) begin

div_cnt <= 6'd0

rAdc_clk <= 1'b0

end

else if ((cs_n_valid1) || (cs_n_valid2)) begin

div_cnt <= div_cnt + 1'b1

if (div_cnt <32)

rAdc_clk <= 1'b1

else

rAdc_clk <= 1'b0

end

assign adc_clk = rAdc_clk

//=================================================================================================

reg [7:0] rAdc_data

always @(posedge clk or negedge rst_n)

if (!rst_n)

rAdc_data <= 8'd0

else

case (clk_cnt)

11'd1513:rAdc_data[7] <= adc_data

11'd1577:rAdc_data[6] <= adc_data

11'd1641:rAdc_data[5] <= adc_data

11'd1705:rAdc_data[4] <= adc_data

11'd1769:rAdc_data[3] <= adc_data

11'd1833:rAdc_data[2] <= adc_data

11'd1897:rAdc_data[1] <= adc_data

11'd1961:rAdc_data[0] <= adc_data

default:rAdc_data[0] <= 1'b0

endcase

endmodule

#include "reg52.H" #include "string.h" #include "intrins.h" #define uint unsigned int #define uchar unsigned char //模拟量测量::ADC0809 #define ADC P0 sbit ALE = P2^7sbit ENABLE = P2^5sbit START = P2^4sbit EOC = P3^7sbit CLK = P3^4uchar ADC0809(void)//模拟量采集 { uchar adc=0 ALE=1_nop_()ALE=0//地址锁存 START=1_nop_()START=0//启动转换 wait:if(EOC==0)goto wait//等待转换结束 _nop_()ENABLE=1_nop_()//读数据 adc=ADC_nop_()ENABLE=0return adc//返回转换值 } void Time0(void) interrupt 1 using 0//ADC0809时钟信号 { CLK=~CLK} void Timer0Init(void)//定时器T0初始化 { TMOD = 0x02TH0 = 0xceTL0 = 0xceET0 = 1TR0 = 1} 定时器采用模式2,8位自动重装初值方式。 初值计算方法: 时钟频率设计为500kHz,则定时时间t=1/f=1/500k=50us 采用12M晶振,机器周期为1us 根据公式:定时时间t=(2^8-x)*1us 计算初值x=2^8-50/1=256-50=206=0xce 改程序是已经实现过的,希望可以帮助你。

通过MAX+PLUSII编写VHDL程序。

1、new出一个文本编辑框,用来保存代码,2、保存并编译vhdl源代码,注意保存的文件名和源代码中的名称相同,文件后缀名为.vhd。3、new出一个仿真波形图。4.在node中添加源代码中的输入输出变量于波形图中。5、给波形图中的输入变量赋值。6、保存并且simulate就可以看到输出波形。

PLD是做为一种通用集成电路产生的,他的逻辑功能按照用户对器件编程来确定。一般的PLD的集成度很高,足以满足设计一般的数字系统的需要。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8131070.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-13
下一篇2023-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存