整理多功能手持数字示波表.docx
- 文档编号:12631665
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:31
- 大小:63.23KB
整理多功能手持数字示波表.docx
《整理多功能手持数字示波表.docx》由会员分享,可在线阅读,更多相关《整理多功能手持数字示波表.docx(31页珍藏版)》请在冰豆网上搜索。
整理多功能手持数字示波表
软件设计
1.软件流程图
VerilogHDL和C语言程序相结合的软件流程图见图2。
图2软件流程图
2.软件设计
部分程序源码
频率计(VerilogHDL程序)
本程序主要用于测量出输入信号的频率。
采用等精度测量的方法,在整个测量范围内误差相同。
可以自动切换量程,指示数据小数点的位置和频率单位。
当输入信号频率过低时还能发出相应的指示信号,通知CPU做出相应控制。
通过适度的采样控制减小了测量误差。
modulefrequency(clk,ret,Fx_clr,Fxin,Fout,LF,spoint,flag_MK);
inputwireclk,ret;
inputwireFxin;//待测频率输入端口
inputwireFx_clr;//CPU的控制信号,控制频率计清零
outputreg[15:
0]Fout;//测得的频率值
outputregLF;//低频标志,高电平是表示为低频
outputreg[1:
0]spoint;//指示小数点的位置
outputreg[1:
0]flag_MK;//频率单位:
M标志K标志
wireFx_cph;
reg[7:
0]cp_ch;
regFend;//测频结束标志
regFsst;//控制本地标频开始计数的标志0:
开始计数
reg[39:
0]Ns;//对本地标频的计数
reg[23:
0]LFCH;//低频检测计数器,对底频率和直流做出警报和指示
reg[15:
0]Nx,Nx1;//对待测频率的计数,Nx1检测低频被测信号的暂存器
regs0,s1,s2,s3,s4,s5,s6,s7,s8,sx1000;
always@(posedgeclkornegedgeret)
if(!
ret)
begin
sx1000<=1'b0;
s0<=1'b0;
s1<=1'b0;
s2<=1'b0;
s3<=1'b0;
s4<=1'b0;
s5<=1'b0;
s6<=1'b0;
s7<=1'b0;
s8<=1'b0;
end
else
begin
sx1000<=(Nx>=1000);
s0<=(Ns==40'd100_0);
s1<=(Ns==40'd100_00);
s2<=(Ns==40'd100_000);
s3<=(Ns==40'd100_000_0);
s4<=(Ns==40'd100_000_00);
s5<=(Ns==40'd100_000_000);
s6<=(Ns==40'd100_000_000_0);
s7<=(Ns==40'd100_000_000_00);
s8<=(Ns>=40'd100_000_000_000);
end
always@(posedgeclkornegedgeret)
if(!
ret)
begin
Fend<=1'b0;
flag_MK<=2'b00;
spoint<=2'b00;
Fout<=16'h0000;
end
else
begin
if(Fend)Fend<=1'b0;
if(Fx_clr)Fend<=1'b1;
if(sx1000)
case({s0,s1,s2,s3,s4,s5,s6,s7,s8})//--F-sp-MK
9'b10_0000_000:
{Fout,Fend,spoint,flag_MK}<={Nx,5'b1_01_10};
9'b01_0000_000:
{Fout,Fend,spoint,flag_MK}<={Nx,5'b1_10_10};
9'b00_1000_000:
{Fout,Fend,spoint,flag_MK}<={Nx,5'b1_11_10};
9'b00_0100_000:
{Fout,Fend,spoint,flag_MK}<={Nx,5'b1_01_01};
9'b00_0010_000:
{Fout,Fend,spoint,flag_MK}<={Nx,5'b1_10_01};
9'b00_0001_000:
{Fout,Fend,spoint,flag_MK}<={Nx,5'b1_11_01};
9'b00_0000_100:
{Fout,Fend,spoint,flag_MK}<={Nx,5'b1_01_00};
9'b00_0000_010:
{Fout,Fend,spoint,flag_MK}<={Nx,5'b1_10_00};
9'b00_0000_001:
{Fout,Fend,spoint,flag_MK}<={Nx,5'b1_11_00};
endcase
end
always@(posedgeclkorposedgeFend)
if(Fend)
begin
LFCH<=24'h000000;
LF<=1'b0;
end
else
begin
LFCH<=LFCH+1'b1;
if(LFCH==24'd100_000_00)beginLF<=(Nx1==Nx);LFCH<=24'h000000;end
if(LFCH==24'd0)Nx1<=Nx;
end
always@(posedgeclkornegedgeret)
if(!
ret)Fsst<=1'b0;
elseif(Fx_cph)Fsst<=!
Fend;//边沿对齐
always@(posedgeclkorposedgeFend)
if(Fend)Ns<=40'h0000000000;
elseif(Fsst)Ns<=Ns+1'b1;
assignFx_cph=(cp_ch==8'b11110000);
always@(posedgeclkorposedgeFend)
if(Fend)cp_ch<=2'b00;
elsecp_ch<={cp_ch[7:
0],Fxin};
always@(posedgeclkorposedgeFend)
if(Fend)Nx<=16'h0000;
elseif(Fx_cph)Nx<=Nx+1'b1;
endmodule
6.3.2LCD控制器(VerilogHDL程序)
主要用于转换控制液晶的协议,加快CPU的写入和控制,可以做到两时钟并行周期访问。
内部有的PWM模块用于控制液晶的显示亮度,CPU只需要向相应的寄存器写入亮度控制数就能控制液晶的亮度。
moduleTFT_LCD_IP(
//ClcokInput时钟和复位
inputcsi_clk,
inputcsi_reset_n,
//Avalon-MMSlave总线的连接
inputavs_chipselect,
input[8:
0]avs_address,//[RS],[A2],[A1],[A0]
//3-----2----1----0位
inputavs_write,
input[31:
0]avs_writedata,
inputavs_read,
output[31:
0]avs_readdata,
//ip_TFT液晶的接口
output[15:
0]coe_lcd_data,
outputcoe_lcd_cs,
outputcoe_lcd_rs,
outputcoe_lcd_wr,
outputregcoe_lcd_pwm,
outputregcoe_lcd_res,
inputcoe_touch_int,
inputcoe_touch_dout,
outputregcoe_touch_din,
outputregcoe_touch_busy,
outputregcoe_touch_dclk,
outputregcoe_touch_cs
);
regdiv_se;
reg[19:
0]div_buf;//PWM的前置分频寄存器
reg[2:
0]count;//脉频计数器
reg[2:
0]pwm_buf;//占空比(0~7)
reg[31:
0]read_data;//总线从外界读取的数据寄存器
wirecheck;//中间检测信号
wireall_cs;
assignall_cs=(avs_address[7:
0]==8'h00);
//writetoip_TFTformNiosIIcpu
assigncheck=avs_write&all_cs;
assigncoe_lcd_wr=check?
1'b1:
1'b0;
assigncoe_lcd_cs=(avs_chipselect&all_cs)?
1'b0:
1'b1;
assigncoe_lcd_rs=avs_address[8];
assigncoe_lcd_data=(avs_chipselect&all_cs)?
avs_writedata[15:
0]:
16'hzzzz;
//使用一个时钟读取时,触摸板能读出正常数据,但是出现闪屏
assignavs_readdata=read_data;
always@(negedgecsi_clkornegedgecsi_reset_n)
begin
if(!
csi_reset_n)
begin
pwm_buf<=3'b111;
coe_lcd_res<=1'b1;
coe_touch_din<=1'b1;
coe_touch_busy<=1'b1;
coe_touch_dclk<=1'b1;
coe_touch_cs<=1'b1;
end
elseif(avs_chipselect&(!
all_cs))
begin
case(avs_address[7:
0])
8'b0000_0001:
pwm_buf<=avs_writedata[2:
0];
8'b0000_0010:
coe_lcd_res<=avs_writedata[0];
8'b0000_0100:
coe_touch_din<=avs_writedata[0];
8'b0000_1000:
coe_touch_busy<=avs_writedata[0];
8'b0001_0000:
coe_touch_dclk<=avs_writedata[0];
8'b0010_0000:
coe_touch_cs<=avs_writedata[0];
8'b0100_0000:
read_data[0]<=coe_touch_int;
8'b1000_0000:
read_data[0]<=coe_touch_dout;
endcase
end
end
always@(posedgecsi_clkornegedgecsi_reset_n)
begin
if(!
csi_reset_n)
begindiv_buf<=20'h00000;
div_se<=1'b0;
end
else
if(div_buf==20'd100000)
begindiv_buf<=20'h00000;
div_se<=1'b1;
end
else
begindiv_buf<=div_buf+1'b1;//计数器计满自动清零
div_se<=1'b0;
end
end
always@(posedgecsi_clkornegedgecsi_reset_n)
begin
if(!
csi_reset_n)
begin
coe_lcd_pwm<=1'b1;
count<=3'b000;
end
else
begin
if(count==pwm_buf)coe_lcd_pwm<=1'b0;//遇到与脉宽调制器相同时,输出管脚清零
elseif(count==3'b000)coe_lcd_pwm<=1'b1;//计满时对管脚置一
if(div_se)count<=count+1'b1;//计数器计满自动清零
end
end
endmodule
触摸板控制程序(VerilogHDL程序)
主要用于转换触摸板AD的串行协议,使CPU能够对其进行并行控制。
它在很大程度上减小了CPU检测触点的难度,加快了软件的运行速度,避免了高速运行的CPU使用延时降低速度去控制低速的触摸板串行AD的情况。
Moduletouch_contrl_IP(ret,clk,address,read,readdata,dint,busy,dclk,dcs,dout,din);
//-----Avalon-MMIO--------------------
inputret,clk;
input[1:
0]address;
inputread;
outputreg[11:
0]readdata;
//-------Avalon-MM要读出的数据
reg[11:
0]txdata,tydata;//触点的XY轴坐标
regCEND;//触摸板总读写结束标志
//------内部逻辑IO--------------------
inputdint;//触摸板按下指示管脚
inputbusy;//触摸芯片忙指示脚
inputdout;//触摸芯片转换的数据
outputregdclk;//送给触摸芯片的时钟
outputregdcs;//触摸芯片的片选
outputregdin;//送给触摸芯片的数据脚
parameterCHX=8'h90,
CHY=8'hd0;
regdeclk;//延时后的时钟信号
reg[15:
0]delay;//时钟延时
reg[7:
0]count;//运行计数器
reg[7:
0]CHbuf;//通道选择寄存器
reg[7:
0]wsbuf;//写入数据的寄存器
reg[11:
0]rbuf;//读出数据的寄存器
reg[1:
0]dstate;//通道选择状态寄存器
reg[3:
0]state;//状态控制寄存器
regwr_cs;//写读使能标志位
regwr_end;//数据写读结束标志位
//--------三态总线接口-----------------------------
always@(posedgeclkornegedgeret)
if(!
ret)readdata<=12'h00000;
elseif(read)
case(address)
2'd0:
readdata[0]<=CEND;
2'd1:
readdata<=txdata;
2'd2:
readdata<=tydata;
default:
readdata<=CEND;
endcase
always@(posedgeclkornegedgeret)
if(!
ret)
begindeclk<=1'b0;
delay<=16'h0000;
end
else
beginif(delay==16'd20)
begindelay<=16'h0000;declk<=~declk;
end
elsedelay<=delay+1'b1;
end
//---------写读X轴、Y轴的分配----------------------
always@(posedgedeclkornegedgeret)
if(!
ret)
beginCHbuf<=CHX;
dstate<=2'd1;
wr_cs<=1'b0;
CEND<=1'b0;
end
else
begin
case(dstate)
2'd1:
beginCEND<=1'b0;CHbuf<=CHX;
if(dint)
beginwr_cs<=1'b0;
dstate<=2'd1;
end
else
beginwr_cs<=1'b1;dstate<=2'd2;
end
end
2'd2:
beginif(wr_end)
begintxdata<=rbuf;CHbuf<=CHY;wr_cs<=1'b1;dstate<=2'd3;
end
else
beginwr_cs<=1'b0;dstate<=2'd2;
end
end
2'd3:
beginwr_cs<=1'b0;
if(wr_end)
begintydata<=rbuf;CEND<=1'b1;dstate<=2'd3;
end
elsedstate<=2'd1;
end
default:
dstate<=2'd1;
endcase
end
//=========向触摸AD芯片写数据==================
always@(posedgedeclkornegedgeret)
if(!
ret)
begindclk<=1'b1;
dcs<=1'b1;
din<=1'b1;
count<=8'h00;
wr_end<=1'b0;
state<=4'd0;
end
else
begin
case(state)
4'd0:
beginwr_end<=1'b0;
if(wr_cs)state<=4'd1;
elsestate<=4'd0;
end
4'd1:
begindcs<=1'b1;
dclk<=1'b0;
din<=1'b0;state<=4'd2;
end
//----------写入数据------------------------------------------------------
4'd2:
begindcs<=1'b0;
count<=8'h00;wsbuf<=CHbuf;//写X轴转换命令-----------------------------------state<=4'd3;
end
4'd3:
begindin<=wsbuf[7];state<=4'd4;
end
4'd4:
beginwsbuf<={wsbuf[6:
0],wsbuf[7]};
dclk<=1'b1;state<=4'd5;
end
4'd5:
beginif(count<=8'h7)
begincount<=8'h00;dclk<=1'b1;state<=4'd6;
end
else
begincount<=count+1'b1;dclk<=1'b0;state<=4'd3;
end
end
//------------读出数据----------------------------------------------------
4'd6:
begindin<=1'b0;
dclk<=1'b1;rbuf<=12'h00000;
if(busy)state<=4'd6;
elsestate<=4'd7;
end
4'd7:
begindclk<=1'b0;state<=4'd8;
end
4'd8:
beginrbuf[0]<=dout;
state<=4'd9;
end
4'd9:
begindclk<=1'b1;
if(count==8'd11)
begincount<=8'h00;dcs<=1'b1;wr_end=1'b1;state<=4'd0;
end
else
begincount<=count+1'b1;rbuf<={rbuf[10:
0],rbuf[11]};state<=4'd7;
end
end
default:
state<=4'd0;
endcase
end
endmodule
6.3.4液晶显示程序(C语言程序)
此程序用于控制液晶显示。
根据配置信息在液晶上显示相应信息,控制人机交互等功能。
#include"define.h"
#include
#include
#include"io.h"
#include"system.h"
#include"asc_zm.h"
externvolatileuintCLD;
//======写入命令============
voidwrite_com(uintaddress,uintnum)
{
send_command(address);
send_data(num);
}
//=======设置地址==============
voidSet_ramaddr(uintx,uinty)
{
write_com(0x0021,y);//行首址
write_com(0x0020,x);//列首址
}
//====液晶初始化===========
voidLCD_init(void)
{
lcd_res(0);//低电平复位
DelayNS(500000);lcd_res
(1);
write_com(0x00,0x0000);DelayNS(3000);
write_com(0x07,0x0001);DelayNS(3000);//DisplayControl1
write_com(0x08,0x0405);DelayNS(3000);//DisplayControl20808
write_com(0x30,0x0707);DelayNS(3000);
write_com(0x31,0x0407);DelayNS(3000);
write_com(0x32,0x0203);DelayNS(3000);
write_com(0x33,0x0303);DelayNS(3000);
write_com(0x34,0x0303);DelayNS(3000);
write_com(0x35,0x0202);DelayNS(3000);
write_com(0x36,0x1007);DelayNS(3000);//0x1111
write_com(0x37,0x0707);DelayNS(3000);//0x0606
write_com(0x38,0x0407);DelayNS(3000);//0x0606
write_com(0x39,0x0203);Dela
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 整理 多功能 手持 数字 示波表