完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在学习《SF-CY3 FPGA套件开发指南Ver7.20 (by特权同学).pdf》,第6.6 逻辑(Verilog)实例7——基于In-System Sources and Probes Editor的AD采集一节时,对其中的一段代码不是很理解,希望大家帮帮忙,在下不胜感激。
module tlc549( clk,rst_n, adc_data,adc_cs_n,adc_clk ); input clk; //25MHz input rst_n; input adc_data; output adc_cs_n; output adc_clk; /************************* 50分频计数 *********************************/ reg[5:0] cntus; //2us always@(posedge clk or negedge rst_n) if(!rst_n) cntus <= 6'd0; else if((cntus < 6'd49)&&(cstate != IDLE)) cntus <= cntus + 1'b1; else cntus <= 6'd0; wire dchag_flag = (cntus == 6'd0); //ADC时钟下降沿标志位,高有效1个时钟周期 wire dlock_flag = (cntus == 6'd24); //ADC时钟上升沿标志位,高有效1个时钟周期 /************************************************************************/ parameter IDLE =3'd0, TSUDL =3'd1, START =3'd2, DTRAN =3'd3, STOP =3'd4, TWHDL =3'd5; reg[2:0] bitnum; //采样数据位寄存器 reg[4:0] d17uscnt; //两次采集数据读取操作的间隔延时计数器,TLC549 > 17us reg[7:0] adc_dinr; //模数转换数据寄存器 reg[7:0] adc_dinlock; //模数转换数据寄存器,用于实时串行数据的锁存 reg[2:0] cstate,nstate; //状态迁移 always@(posedge clk or negedge rst_n) if(!rst_n) cstate <= IDLE; else cstate <= nstate; //数据采集位的控制,用于准确定位当前采样的ADC数据位 always@(posedge clk or negedge rst_n) if(!rst_n) bitnum <= 3'd0; else if(nstate == IDLE) bitnum <= 3'd7; else if((nstate == DTRAN)&&dlock_flag) bitnum <= bitnum - 1'b1; //两次读取操作的间隔延时计数逻辑 always@(posedge clk or negedge rst_n) if(!rst_n) d17uscnt <= 5'd0; else if((nstate == TWHDL)&&dchag_flag) d17uscnt <= d17uscnt + 1'b1; else if(nstate == IDLE) d17uscnt <= 5'd0; //定时ADC读取操作状态控制 always@(cstate or dchag_flag or bitnum or d17uscnt) case(cstate) IDLE: nstate <= TSUDL; TSUDL: if(dchag_flag) nstate <= START; else nstate <= TSUDL; START: if(dchag_flag) nstate <= DTRAN; else nstate <= START; DTRAN: if(dchag_flag&&(bitnum == 3'd7)) nstate <= STOP; else nstate <= DTRAN; STOP: if(dchag_flag) nstate <= TWHDL; else nstate <= STOP; TWHDL: if(dchag_flag&&(d17uscnt == 5'd18)) nstate <= IDLE; else nstate <=TWHDL; default: nstate <= IDLE; endcase //数据逐位锁存 always@(posedge clk or negedge rst_n) if(!rst_n) adc_dinlock <= 8'h00; else if((nstate == DTRAN)&&dlock_flag) adc_dinlock[bitnum] <= adc_data; //完成1次数据采集后,锁存最新数据 always@(posedge clk or negedge rst_n) if(!rst_n) adc_dinr <= 8'h00; else if(nstate == STOP) adc_dinr <= adc_dinlock; assign adc_cs_n = ~((cstate == DTRAN)|(cstate == START)|(cstate == TSUDL)); /************************* ADC时钟产生逻辑 *********************************/ reg adc_clkr; //1MHz always@(posedge clk or negedge rst_n) if(!rst_n) adc_clkr <= 1'b0; else if((nstate == DTRAN)&&(cntus > 5'd12)) adc_clkr <= 1'b1; else adc_clkr <= 1'b0; assign adc_clk = adc_clkr; /*******************************************************************************/ //In—System Source and Probes Edition例化 mydebug mydebug_inst( .probe(adc_dinr), .source() ); endmodule 以上代码蓝色部分 else if((nstate == DTRAN)&&(cntus > 5'd12)) 这句如何理解,这个 5'd12这个数值是哪来的? |
|
相关推荐
1 个讨论
|
|
只有小组成员才能发言,加入小组>>
882个成员聚集在这个小组
加入小组4507 浏览 0 评论
特权同学 Verilog边码边学 Lesson01 Vivado下载与安装
2613 浏览 1 评论
玩转Zynq连载50——[ex69] FIR滤波器IP仿真实例
4293 浏览 2 评论
玩转Zynq连载49——[ex68] MT9V034摄像头的图像FFT滤波处理
5242 浏览 1 评论
玩转Zynq连载48——[ex67] Vivado FFT和IFFT IP核应用实例
5277 浏览 0 评论
1922浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 06:23 , Processed in 0.577376 second(s), Total 47, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号