版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章常用接口电路设计第7章常用接口电路设计LED显示控制直流电动机控制数码管显示控制蜂鸣器播放音乐按键脉冲信号产生电路步进电动机控制序列检测器LCD1602显示控制IIC总线存储器控制SPI总线存储器控制串行ADC控制阵列键盘控制串行DAC控制点阵控制7.1LED显示控制【例7.1-1】实现8位LED灯的流水设计的VerilogHDL描述。//LED控制运行方式1moduleled_run(inputclk,rst_n,outputreg[7:0]led); always@(posedgeclkornegedgerst_n)if(!rst_n)led<=8'b00000001;//复位时LED灯熄灭elseled<={led[6:0],led[7]}; //循环左移1位endmodule7.1LED显示控制【例7.1-2】通过状态设计LED灯显示模式的VerilogHDL描述。//LED控制运行方式2moduleled_run_2(inputclk,rst_n,output[7:0]led);parameters0=8'b00000001, //状态分配,指定每种状态LED灯s1=8'b00000010,s2=8'b00000100,s3=8'b00001000,s4=8'b00010000,s5=8'b00100000,s6=8'b01000000,s7=8'b10000000; //可以修改各状态LED灯的情况reg[7:0]state;7.1LED显示控制//状态转换always@(posedgeclkornegedgerst_n)if(!rst_n)state<=s0; //初始复位else case(state) //用来确定状态转换的顺序 s0:state<=s1; s1:state<=s2; s2:state<=s3; s3:state<=s4; s4:state<=s5; s5:state<=s6; s6:state<=s7; s7:state<=s0; default:state<=s0; endcaseassignled=state; //LED输出显示endmodule7.2数码管显示控制【例7.2-1】
通过数码管显示拨码开关表示的二进制数值的VerilogHDL描述。moduleseg7display_one(input[3:0]sw,outputreg[6:0]seg, //数码管段码CG,CF,CE,CD,CC,CB,CAoutputdp, //数码管小数点output[7:0]an //数码管位码);assigndp=1;assignan=8'b11111110; //仅一个数码管显示,低电平有效always@(sw)case(sw)4'b0000:seg=7'b1000000;//段码g~a,显示04'b0001:seg=7'b1111001;//显示14'b0010:seg=7'b0100100;//显示24'b0011:seg=7'b0110000;//显示37.2数码管显示控制4'b0100:seg=7'b0011001; //显示44'b0101:seg=7'b0010010; //显示54'b0110:seg=7'b0000010; //显示64'b0111:seg=7'b1111000; //显示74'b1000:seg=7'b0000000; //显示84'b1001:seg=7'b0010000; //显示94'b1010:seg=7'b0001000; //显示A4'b1011:seg=7'b0000011; //显示B4'b1100:seg=7'b1000110; //显示C4'b1101:seg=7'b0100001; //显示D4'b1110:seg=7'b0000110; //显示E4'b1111:seg=7'b0001110; //显示Fdefault:seg=7'b1111111; //默认数码管熄灭endcaseendmodule7.2数码管显示控制【例7.2-2】4位数码管动态显示拨码开关表示的二进制数值的VerilogHDL描述。//动态显示顶层模块moduleseg7display_4_top(inputclk,rst,input[15:0]sw,outputdp, //数码管上的小数点output[6:0]seg,//数码管7位段码output[7:0]an//8个数码管对应的位码);wireclk_1khz;div_1khzu1(.clk(clk),//调用1kHz分频电路,用于动态扫描.rst(rst),.clk_1khz(clk_1khz));seg7display_4u2(.clk(clk_1khz),//调用动态显示7.2数码管显示控制.rst(rst),.data(sw),.dp(dp),.seg(seg),.an(an));endmodule//1kHz分频模块modulediv_1khz(inputclk,rst,outputregclk_1khz);reg[15:0]cnt;always@(posedgeclkorposedgerst)beginif(rst==1)cnt<=0; //高电平异步复位,计数清零7.2数码管显示控制elseif(cnt==50000-1)begincnt<=0;clk_1khz<=~clk_1khz;//产生1kHz信号endelsecnt<=cnt+1; //计数endendmodule//动态显示模块moduleseg7display_4(inputclk,rst,input[15:0]data, //待显示的4位十六进制数outputdp,outputreg[6:0]seg,outputreg[7:0]an);7.2数码管显示控制reg[1:0]sel; //位码控制信号reg[3:0]disp;assigndp=1; //不显示小数点always@(posedgeclkorposedgerst)beginif(rst)beginan=8'b1111_1111; //复位时数码管全部熄灭sel=0;endelsebeginsel=sel+1; //位码控制信号依次选通不同位数码管case(sel)2'b00:begindisp=data[3:0];an=8'b1111_1110;end//最右侧数码管显示2'b01:begindisp=data[7:4];an=8'b1111_1101;end2'b10:begindisp=data[11:8];an=8'b1111_1011;end7.2数码管显示控制2'b11:begindisp=data[15:12];an=8'b1111_0111;enddefault:;//默认不做任何操作endcaseendendalways@(disp) //数据显示译码case(disp)4'b0000:seg=7'b1000000; //段码g~a,显示04'b0001:seg=7'b1111001; //显示14'b0010:seg=7'b0100100; //显示24'b0011:seg=7'b0110000; //显示34'b0100:seg=7'b0011001; //显示44'b0101:seg=7'b0010010; //显示54'b0110:seg=7'b0000010; //显示67.2数码管显示控制4'b0111:seg=7'b1111000; //显示74'b1000:seg=7'b0000000;//显示84'b1001:seg=7'b0010000;//显示94'b1010:seg=7'b0001000;//显示A4'b1011:seg=7'b0000011; //显示B4'b1100:seg=7'b1000110; //显示C4'b1101:seg=7'b0100001;//显示D4'b1110:seg=7'b0000110; //显示E4'b1111:seg=7'b0001110; //显示Fdefault:seg=7'b1111111; //默认数码管熄灭endcaseendmodule7.2数码管显示控制【例7.2-3】结构化设计四位数码管动态扫描显示的VerilogHDL描述。moduleseg7display_4(inputclk,rst_n,input[15:0]data,//待显示的4位十六进制数output[7:0]seg,output[3:0]an
);wireclk_1khz;divider#(.CLK_FREQ(25000000),.CLK_OUT_FREQ(1000)) U1(.clk(clk), //调用1kHz分频电路,用于动态扫描 .rst_n(rst_n), .clk_out(clk_1khz));seg7displayU2(.clk(clk_1khz), //调用动态显示.rst_n(rst_n),.data(data),.seg(seg),.an(an));endmodule7.2数码管显示控制【例7.2-4】4位数码管滚动显示数值的VerilogHDL描述。moduleseg7display_scroll(inputclk,rst_n, //时钟和复位信号output[7:0]seg, //段码output[3:0]an //位码);wireclk_1khz,clk_scroll;wire[15:0]data;divider#(.CLK_FREQ(25000000),.CLK_OUT_FREQ(1000)) //分频器输出时钟频率:1KHz
U1(.clk(clk),
.rst_n(rst_n),
.clk_out(clk_1khz)); //调用1kHz分频模块
7.2数码管显示控制seg7displayU2(.clk(clk_1khz),.rst_n(rst_n),.data(data),.seg(seg), .an(an)); //调用8位动态显示模块divider#(.CLK_FREQ(25000000),.CLK_OUT_FREQ(0.5)) //分频器输出时钟频率:0.5Hz U3(.clk(clk),.rst_n(rst_n),.clk_out(clk_scroll)); //调用1kHz分频模块process_data_scroll#(.info(64'hABCDEF9876543210)) U4(.clk(clk_scroll), .rst_n(rst_n), .data(data)); //调用数据处理模块endmodule7.2数码管显示控制//处理待显示数据模块moduleprocess_data_scroll#(parameterinfo=64'hF9E8D7C6B5A43210)( //滚动显示信息inputclk,rst_n,output[15:0]data);reg[63:0]message;assigndata=message[63:48];always@(posedgeclkornegedgerst_n) if(!rst_n) message<=info; //初始显示值 elsemessage<={message[59:0],message[63:60]}; //移位操作endmodule7.3蜂鸣器播放音乐【例7.3-1】通过蜂鸣器演奏音乐《梁祝》的VerilogHDL描述。7.4阵列键盘控制【例7.4-1】4×4阵列键盘控制的VerilogHDL描述实例。modulekey4x4(clk,row,column,y);inputclk;input[3:0]row;outputreg[3:0]column;outputreg[3:0]y;reg[1:0]cnt;always@(posedgeclk)begin cnt<=cnt+1; case(cnt) 2'b00:column=4'b0001; 2'b01:column=4'b0010; 2'b10:column=4'b0100; 2'b11:column=4'b1000; endcase case({column,row}) 8'b0001_0001:y<=4'b0001;//显示1,c4,c3,d2,c1,r4,r3,r2,r17.4阵列键盘控制 8'b0010_0001:y<=4'b0010;//显示2 8'b0100_0001:y<=4'b0011;//显示3 8'b1000_0001:y<=4'b1100;//显示C 8'b0001_0010:y<=4'b0100;//显示4 8'b0010_0010:y<=4'b0101;//显示5 8'b0100_0010:y<=4'b0110;//显示6 8'b1000_0010:y<=4'b1101;//显示D 8'b0001_0100:y<=4'b0111;//显示7 8'b0010_0100:y<=4'b1000;//显示8 8'b0100_0100:y<=4'b1001;//显示9 8'b1000_0100:y<=4'b1110;//显示E 8'b0001_1000:y<=4'b1010;//显示A 8'b0010_1000:y<=4'b0000;//显示0 8'b0100_1000:y<=4'b1011;//显示B 8'b1000_1000:y<=4'b1111;//显示F endcaseendendmodule7.5按键脉冲信号产生电路【例7.5-1】
使用按键产生脉冲信号的VerilogHDL描述实例。//按键产生脉冲模块modulekey_pulse(inputclk, //时钟信号inputkey, //按键输入outputpulse //脉冲输出);regkey_r,key_rr;always@(posedgeclk)beginkey_r<=key;key_rr<=key_r;endassignpulse=key&key_r&~key_rr; //脉冲产生endmodule7.5脉冲信号产生电路【例7.5-2】使用按键产生脉冲信号的Testbench仿真测试实例。modulekey_pulse_tb();regclk,key;wirepulse;key_pulsetest(.clk(clk),.key(key),.pulse(pulse));initialbeginclk=0;key=0;#105key=0;#50key=1;#200key=0;#100key=1;endalways#10clk=~clk;endmodule7.6直流电动机控制首先调用例7.5-1的按键脉冲电路,每次按下按键都会对应产生脉冲信号,按键分为正转、反转、停止,加速和减速。然后通过步进电机模块,产生所需要的控制电机转动方向和PWM波形,输出给电机驱动电路,实现直流电机控制。程序设计参考例7.6-1。7.7步进电动机控制首先调用例7.5-1的按键脉冲电路,每次按下按键都会对应产生脉冲信号,然后输入给步进电机模块,产生所需要的控制波形,按一定的顺序给步进电机的各相轮流通电,步进电机就能转动起来。程序设计参考例7.7-1。7.8序列检测器【例7.8-1】
序列检测电路的VerilogHDL描述实例。//序列检测电路顶层文件modulesequence_detect(inputclk,rst, //时钟和复位信号input[1:0]key, //定义按键1和0outputled //输出指示);wirepulse;key_pulseu1(.clk(clk),.key(|key),.pulse(pulse));//调用脉冲产生电路sequence_compareu2(.clk(pulse),.rst(rst),.data(key[1]),.result(led)); //调用序列比较电路endmodule7.8序列检测器//序列比较模块u2modulesequence_compare(inputclk,rst,inputdata,outputresult); parameters0=2'b00, //s0状态表示没有出现1s1=2'b01, //s1状态表示出现第一个1s2=2'b10, //s2状态表示出现连续两个1s3=2'b11; //s3状态表示出现序列110reg[1:0]next_state;always@(posedgeclkorposedgerst)if(rst)next_state=s0; //异步复位,初始状态s0elsecase(next_state)7.8序列检测器 s0:if(data==1'b1)next_state=s1; elsenext_state=s0; s1:if(data==1'b1)next_state=s2; elsenext_state=s0; s2:if(data==1'b1)next_state=s2; elsenext_state=s3; s3:if(data==1'b1)next_state=s1; elsenext_state=s0; default:next_state=s0;endcaseassignresult=(next_state==s3)?1:0; //穆尔型输出endmodule7.9LCD1602显示控制根据显示器手册,设计状态机实现读写时序,使LCD1602显示动态数据。LCD1602显示控制使用了3个模块实现:模块U0调用了例4.4-11参数化分频器,对系统25MHz信号分频用作U2显示模块的时钟。显示模块U2,通过状态机,实现LCD1602读写时序。U1模块为测试模块,用来产生显示器需要显示的数据,最后一位数据0-9每秒变化一次。程序设计参见例7.9-1。7.10IIC总线存储器控制集成电路总线(Inter-IntegratedCircuit,即IIC)一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。总线的运行(数据传输)由主机控制。所谓主机是指启动数据的传送(发出启动信号)、发出时钟信号以及传送结束时发出停止信号的设备。被主机寻访的设备称为从机。为了进行通讯,每个接到IIC总线的设备都有一个唯一的地址,以便于主机寻访。主机和从机的数据传送,可以由主机发送数据到从机,也可以由从机发到主机。在IIC总线传输过程中,将两种特定的情况定义为开始和停止条件:当SCL保持“高”时,SDA由“高”变为“低”为开始条件;当SCL保持“高”且SDA由“低”变为“高”时为停止条件。开始和停止条件均由主控制器产生。SDA线上的数据在时钟“高”期间必须是稳定的,只有当SCL线上的时钟信号为低时,数据线上的“高”或“低”状态才可以改变。输出到SDA线上的每个字节必须是8位,每次传输的字节不受限制,但每个字节必须要有一个应答ACK。如果一接收器件在完成其他功能(如一内部中断)前不能接收另一数据的完整字节时,它可以保持时钟线SCL为低,以促使发送器进入等待状态;当接收器准备好接受数据的其它字节并释放时钟SCL后,数据传输继续进行。数据传送具有应答是必须的。与应答对应的时钟脉冲由主控制器产生,发送器在应答期间必须下拉SDA线。当寻址的被控器件不能应答时,数据保持为高并使主控器产生停止条件而终止传输。在传输的过程中,如果用到了主控接收器,那么主控接收器必须发出一数据结束信号给被控发送器,从而使被控发送器释放数据线,以允许主控器产生停止条件。7.11SPI总线存储器控制SPI是串行外设接口(SerialPeripheralInterface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时在PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议。SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要4根线,分别是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)、CS(片选)。7.12串行ADC控制用VerilogHDL实现对8位串行ADC芯片TLC549控制,例7.12-1控制串行ADC采样外部0-3.3V电压,并通过四位数码管显示采集的模拟值。TLC549带有片内系统时钟,该时钟与外部I/OCLOCK时钟是独立工作的,无需特殊的速度或相位匹配。当CS为高时,数据输出DATAOUT端处于高阻状态,此时I/OCLOCK不起作用。这种CS控制作用允许在同时使用多片TLC549时,共用I/OCLOCK,以减少多片A/D使用时的I/O控制端口。7.13串行DAC控制本节用VerilogHDL实现对12位串行DAC芯片DAC7512控制,例7
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农贸市场清洁外包合同
- 2026年汽车维修钣金工考试模拟试题(含答案)
- 人行桥道路基层施工方案
- 垃圾处理工程施工隐患排查保证措施
- 轻骨料混凝土施工方案模板
- 车库消防水泵接合器施工方案
- 公司逼迫签订外包合同
- 外拓业务团队外包合同
- 途牛2025转外包合同
- 钢筋精细化下料施工工艺
- 村干部工作考勤制度
- 2025山东威海乳山市人民医院公开招聘急需紧缺专业人才10人笔试历年典型考题及考点剖析附带答案详解试卷2套
- 建设养牛场合同协议书
- GB/T 31703-2025陶瓷球轴承氮化硅球
- GB/Z 140-2025用于电量测量和监测、电能质量监测、数据采集和分析的装置的网络安全
- 顺德农商银行2025年秋季招聘参考题库附答案
- 专题10 浮力及其应用-三年(2023-2025)中考《物理》真题分项汇编(江苏专用)
- EORTC-生命质量测定量表-QLQ-C30-(V30)-中文版
- 2025杭州市北京航空航天大学国际创新研究院招聘32人(公共基础知识)综合能力测试题附答案解析
- (2025年)医疗技术临床应用及新技术新项目管理制度考核试题及标准(含答案)
- 2025年北京二级造价工程师考试建设工程造价管理基础知识真题及答案
评论
0/150
提交评论