当前位置: 首页 > news >正文

订做网站和app花都高端网站建设

订做网站和app,花都高端网站建设,购物网站开发文献综述,wordpress的主题是什么意思#x1f389;欢迎来到FPGA专栏~三线制数码管驱动 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒#x1f379; ✨博客主页#xff1a;小夏与酒的博客 #x1f388;该系列文章专栏#xff1a;FPGA学习之旅 文章作者技术和水平有限#xff0c;如果文中出现错误#xff0c;希望大家能指… 欢迎来到FPGA专栏~三线制数码管驱动 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒 ✨博客主页小夏与酒的博客 该系列文章专栏FPGA学习之旅 文章作者技术和水平有限如果文中出现错误希望大家能指正 欢迎大家关注 ❤️ 目录-三线制数码管驱动 一、效果演示二、电路结构三、代码详解3.1 总体结构设计3.2 驱动74HC595芯片3.3 HEX8模块3.4 顶层模块 四、按键控制改变数据值 一、效果演示 ISSP调试演示 程序配置完成 调试 按键控制演示 二、电路结构 在三线制的数码管驱动中使用74HC595芯片来减少FPGA的管脚数量使用。 关于74HC595芯片的介绍和时序图参考文章74HC595介绍 和 74HC595 驱动。 在AC620开发板上的数码管驱动电路 AC620开发板使用的是74HC595芯片的级联来驱动显示 三、代码详解 3.1 总体结构设计 先上RTL视图 HEX8模块将seg和sel信号传给m74HC595_Driver模块然后将接收到的信号转换为DS、SH_CP和ST_CP信号ISSP模块用于调试。 3.2 驱动74HC595芯片 关于74HC595芯片的驱动主要参考该时序图进行代码编写 74HC595是8位串行移位寄存器带有存储寄存器和三态寄存器其中移位寄存器和存储寄存器分别采用不同的时钟。其可以把串行的信号转为并行的信号因此常用做各种数码管以及点阵屏的驱动芯片。 该芯片的主要IO IO名称功能DS / SER串行数据输入端STCP / RCK存储寄存器的时钟输入。上升沿时移位寄存器中的数据进入存储寄存器下降沿时存储寄存器中的数据保持不变。应用时通常将 ST_CP 置为低点平移位结束后再在 ST_CP 端产生一个正脉冲更新显示数据。SHCP / SCK移位寄存器的时钟输入。上升沿时移位寄存器中的数据依次移动一位即 Q0 中的数据移到 Q1 中Q1 中的数据移到 Q2 中依次类推下降沿时移位寄存器中的数据保持不变。 由于在AC620开发板中芯片采用3.3V供电这样在设计74HC595工作频率时直接使用50M晶振四分频后的时钟作为其工作时钟。 74HC595的驱动代码由于模块命名不能以数字开头所以加了个m m74HC595_Driver.v module m74HC595_Driver(Clk,Rst_n,Data,S_EN,SH_CP,ST_CP,DS);parameter DATA_WIDTH 16;input Clk;input Rst_n;input [DATA_WIDTH-1 : 0] Data; //data to sendinput S_EN; //send enoutput reg SH_CP; //shift clockoutput reg ST_CP; //latch data clockoutput reg DS; //shift serial dataparameter CNT_MAX 4;reg [15:0] divider_cnt;//分频计数器wire sck_pluse;reg [4:0]SHCP_EDGE_CNT;//SH_CP EDGE counterreg [15:0]r_data;always(posedge Clk or negedge Rst_n)beginif(!Rst_n)r_data 16d0;else if(S_EN)r_data Data;elser_data r_data;end//clock dividealways(posedge Clk or negedge Rst_n)beginif(!Rst_n)divider_cnt 16d0;else if(divider_cnt CNT_MAX)divider_cnt 16d0;elsedivider_cnt divider_cnt 1b1;endassign sck_pluse (divider_cnt CNT_MAX);always(posedge Clk or negedge Rst_n)beginif(!Rst_n)SHCP_EDGE_CNT 5d0;else if(sck_pluse)beginif(SHCP_EDGE_CNT 5d31)SHCP_EDGE_CNT 5d0;elseSHCP_EDGE_CNT SHCP_EDGE_CNT 1b1;endelseSHCP_EDGE_CNT SHCP_EDGE_CNT;end always(posedge Clk or negedge Rst_n)beginif(!Rst_n)beginSH_CP 1b0;ST_CP 1b0;DS 1b0; endelse begincase(SHCP_EDGE_CNT)5d0: begin SH_CP 1b0; ST_CP 1b1; DS r_data[15]; end5d1: begin SH_CP 1b1; ST_CP 1b0;end5d2: begin SH_CP 1b0; DS r_data[14];end5d3: begin SH_CP 1b1; end5d4: begin SH_CP 1b0; DS r_data[13];end5d5: begin SH_CP 1b1; end5d6: begin SH_CP 1b0; DS r_data[12];end5d7: begin SH_CP 1b1; end5d8: begin SH_CP 1b0; DS r_data[11];end5d9: begin SH_CP 1b1; end5d10:begin SH_CP 1b0; DS r_data[10];end5d11:begin SH_CP 1b1; end5d12:begin SH_CP 1b0; DS r_data[9];end5d13:begin SH_CP 1b1; end5d14:begin SH_CP 1b0; DS r_data[8];end5d15:begin SH_CP 1b1; end5d16:begin SH_CP 1b0; DS r_data[7];end5d17:begin SH_CP 1b1; end5d18:begin SH_CP 1b0; DS r_data[6];end5d19:begin SH_CP 1b1; end5d20:begin SH_CP 1b0; DS r_data[5];end5d21:begin SH_CP 1b1; end5d22:begin SH_CP 1b0; DS r_data[4];end5d23:begin SH_CP 1b1; end5d24:begin SH_CP 1b0; DS r_data[3];end5d25:begin SH_CP 1b1; end5d26:begin SH_CP 1b0; DS r_data[2];end5d27:begin SH_CP 1b1; end5d28:begin SH_CP 1b0; DS r_data[1];end5d29:begin SH_CP 1b1; end5d30:begin SH_CP 1b0; DS r_data[0];end5d31:begin SH_CP 1b1; enddefault:begin SH_CP 1b0;ST_CP 1b0;DS 1b0; endendcase endendendmodule RTL视图 3.3 HEX8模块 该模块的设计是在该文章的讲解基础之上进行修改【FPGA零基础学习之旅#11】数码管动态扫描。 上述参考文章中的模块可以称为HEX6驱动了6个数码管在此我们需要驱动8个数码管故可以将模块命名为HEX8。 需要注意的是在设计数码管位选的时候一定要看清使用板子的电路结构弄清楚是高电平位选还是低电平位选 HEX8.v module HEX8(input Clk, //50Minput Rst_n, //复位input En, //数码管显示使能input [31:0] disp_data, //8 × 4 328个数码管数据格式为hex总共输32位output reg [7:0] seg, //数码管段选output [7:0] sel //数码管位选数码管选择 );reg [7:0]sel_r;//--------分频器--------reg [14:0]divider_cnt;//25000-1reg clk_1K;reg [3:0]data_tmp;//待显示数据缓存//1KHz分频计数器always(posedge Clk or negedge Rst_n)beginif(!Rst_n)divider_cnt 15d0;else if(!En)divider_cnt 15d0;else if(divider_cnt 24999)divider_cnt 15d0;elsedivider_cnt divider_cnt 1b1;end//1KHz扫描时钟always(posedge Clk or negedge Rst_n)beginif(!Rst_n)clk_1K 1b0;else if(divider_cnt 24999)clk_1K ~clk_1K;elseclk_1K clk_1K;end//--------6位循环移位寄存器-------- always(posedge clk_1K or negedge Rst_n)beginif(!Rst_n)sel_r 8b0000_0001;else if(sel_r 8b1000_0000)sel_r 8b0000_0001;elsesel_r sel_r 1;end //--------6选1多路器-------- always(*)begincase(sel_r)8b0000_0001:data_tmp disp_data[3:0];8b0000_0010:data_tmp disp_data[7:4];8b0000_0100:data_tmp disp_data[11:8];8b0000_1000:data_tmp disp_data[15:12];8b0001_0000:data_tmp disp_data[19:16];8b0010_0000:data_tmp disp_data[23:20];8b0100_0000:data_tmp disp_data[27:24];8b1000_0000:data_tmp disp_data[31:28];default:data_tmp 4b0000;endcaseend//--------LUT-------- always(*)begincase(data_tmp)4h0:seg 8hc0;4h1:seg 8hf9;4h2:seg 8ha4;4h3:seg 8hb0;4h4:seg 8h99;4h5:seg 8h92;4h6:seg 8h82;4h7:seg 8hf8;4h8:seg 8h80;4h9:seg 8h90;4ha:seg 8h88;4hb:seg 8h83;4hc:seg 8hc6;4hd:seg 8ha1;4he:seg 8h86;4hf:seg 8h8e;endcaseend//--------2选1多路器-------- assign sel (En)?(sel_r):8b1111_1111;endmodule 3.4 顶层模块 在顶层模块中需要调用ISSP这样的一个IP核操作过程和调试方法参考【FPGA零基础学习之旅#11】数码管动态扫描。 smg.v module smg(input Clk, //50Minput Rst_n,//input [31:0] disp_data,output SH_CP, //shift clockoutput ST_CP, //latch data clockoutput DS //shift serial data );wire [7:0] sel;//数码管位选选择当前要显示的数码管wire [7:0] seg;//数码管段选当前要显示的内容 wire [31:0] disp_data;ISSP UISSP(.probe(),.source(disp_data));HEX8 UHEX8(.Clk(Clk),.Rst_n(Rst_n),.En(1b1),.disp_data(disp_data),.sel(sel),.seg(seg));m74HC595_Driver Um74HC595_Driver(.Clk(Clk),.Rst_n(Rst_n),.Data({seg,sel}),.S_EN(1b1),.SH_CP(SH_CP),.ST_CP(ST_CP),.DS(DS));endmodule 四、按键控制改变数据值 项目要求 通过控制按键使得数码管显示不同的数据内容。 实现效果 先看RTL视图来理解整体框架 按下按键1数码管显示12345678按下按键2数码管显示89abcdef。 按键消抖模块的设计参考该文章【FPGA零基础学习之旅#10】按键消抖模块设计与验证一段式状态机实现。 在此贴出按键消抖的代码 KeyFilter.v // //模块按键消抖模块 //key_state输出消抖之后按键的状态 //key_flag按键消抖结束时产生一个时钟周期的高电平脉冲 // module KeyFilter(input Clk,input Rst_n,input key_in,output reg key_flag,output reg key_state );//按键的四个状态localparamIDLE 4b0001,FILTER1 4b0010,DOWN 4b0100,FILTER2 4b1000;//状态寄存器reg [3:0] curr_st;//边沿检测输出上升沿或下降沿wire pedge;wire nedge;//计数寄存器reg [19:0]cnt;//使能计数寄存器reg en_cnt;//计数满标志信号reg cnt_full;//计数满寄存器//------边沿检测电路的实现------//边沿检测电路寄存器reg key_tmp0;reg key_tmp1;//边沿检测always(posedge Clk or negedge Rst_n)beginif(!Rst_n)beginkey_tmp0 1b0;key_tmp1 1b0;endelse beginkey_tmp0 key_in;key_tmp1 key_tmp0;end endassign nedge (!key_tmp0) (key_tmp1);assign pedge (key_tmp0) (!key_tmp1);//------状态机主程序------ //状态机主程序always(posedge Clk or negedge Rst_n)beginif(!Rst_n)begincurr_st IDLE;en_cnt 1b0;key_flag 1b0;key_state 1b1;endelse begincase(curr_st)IDLE:beginkey_flag 1b0;if(nedge)begincurr_st FILTER1;en_cnt 1b1;endelsecurr_st IDLE;endFILTER1:beginif(cnt_full)beginkey_flag 1b1;key_state 1b0;curr_st DOWN;en_cnt 1b0;end else if(pedge)begincurr_st IDLE;en_cnt 1b0;endelsecurr_st FILTER1;endDOWN:beginkey_flag 1b0;if(pedge)begincurr_st FILTER2;en_cnt 1b1;endelsecurr_st DOWN;endFILTER2:beginif(cnt_full)beginkey_flag 1b1;key_state 1b1;curr_st IDLE;en_cnt 1b0;end else if(nedge)begincurr_st DOWN;en_cnt 1b0;endelsecurr_st FILTER2;enddefault:begincurr_st IDLE;en_cnt 1b0;key_flag 1b0;key_state 1b1;endendcaseendend//------20ms计数器------ //20ms计数器//Clk 50_000_000Hz//一个时钟周期为20ns//需要计数20_000_000 / 20 1_000_000次always(posedge Clk or negedge Rst_n)beginif(!Rst_n)cnt 20d0;else if(en_cnt)cnt cnt 1b1;elsecnt 20d0;endalways(posedge Clk or negedge Rst_n)beginif(!Rst_n)cnt_full 1b0;else if(cnt 999_999)cnt_full 1b1;elsecnt_full 1b0;endendmodule 简单编写了一个KeyData模块用于不同数据的输入 KeyData.v module KeyData(input Clk,input Rst_n,input Key_state1,input Key_flag1,input Key_state2,input Key_flag2,output reg [31:0] dis_data );always(posedge Clk or negedge Rst_n)beginif(!Rst_n)dis_data 32h00000000;else if(Key_flag1 !Key_state1)dis_data 32h12345678;else if(Key_flag2 !Key_state2)dis_data 32h89abcdef;else dis_data dis_data;endendmodule 顶层模块KeyCtrlSmg.v module KeyCtrlSmg(input Clk,input Rst_n,input KeyIn1,input KeyIn2,output SH_CP, //shift clockoutput ST_CP, //latch data clockoutput DS //shift serial data );wire key_state1;wire key_flag1;wire key_state2;wire key_flag2;wire [7:0] sel;//数码管位选选择当前要显示的数码管wire [7:0] seg;//数码管段选当前要显示的内容 wire [31:0] dis_data;KeyFilter KeyFilter1(.Clk(Clk),.Rst_n(Rst_n),.key_in(KeyIn1),.key_flag(key_flag1),.key_state(key_state1));KeyFilter KeyFilter2(.Clk(Clk),.Rst_n(Rst_n),.key_in(KeyIn2),.key_flag(key_flag2),.key_state(key_state2));KeyData UKeyData(.Clk(Clk),.Rst_n(Rst_n),.Key_state1(key_state1),.Key_flag1(key_flag1),.Key_state2(key_state2),.Key_flag2(key_flag2),.dis_data(dis_data));HEX8 UHEX8(.Clk(Clk),.Rst_n(Rst_n),.En(1b1),.disp_data(dis_data),.sel(sel),.seg(seg));m74HC595_Driver Um74HC595_Driver(.Clk(Clk),.Rst_n(Rst_n),.Data({seg,sel}),.S_EN(1b1),.SH_CP(SH_CP),.ST_CP(ST_CP),.DS(DS));endmodule 测试激励文件 timescale 1ns/1ns define clock_period 20module KeyCtrlSmg_tb;reg Clk;reg Rst_n;reg KeyIn1;reg KeyIn2;wire SH_CP;wire ST_CP;wire DS;KeyCtrlSmg UKeyCtrlSmg(.Clk(Clk),.Rst_n(Rst_n),.KeyIn1(KeyIn1),.KeyIn2(KeyIn2),.SH_CP(SH_CP), //shift clock.ST_CP(ST_CP), //latch data clock.DS(DS) //shift serial data);initial Clk 1;always#(clock_period / 2) Clk ~Clk;initial begin Rst_n 0;KeyIn1 1;KeyIn2 1;#200;Rst_n 1;#200;KeyIn1 0;KeyIn2 1;#(clock_period*10000)KeyIn1 1;KeyIn2 1;#(clock_period*10000)KeyIn1 1;KeyIn2 0;#(clock_period*10000)$stop;endendmodule 仿真结果 结尾 ❤️ 感谢您的支持和鼓励 您可能感兴趣的内容【FPGA】串口通信讲解-状态机判断数据值【Python】串口通信-与FPGA、蓝牙模块实现串口通信PythonFPGA 【Arduino TinyGo】【最新】使用Go语言编写Arduino-环境搭建和点亮LED灯【全网首发开源教程】【Labview机器人仿真与控制】Labview与Solidworks多路支配关系-四足爬行机器人仿真与控制
http://www.w-s-a.com/news/392271/

相关文章:

  • 公司网站友情链接怎么做副链华为荣耀手机官网
  • 一条龙做网站旅游网页设计模板图凡科
  • 中山网站建设哪家便宜在中国做外国网站怎么收钱
  • 网站优化大计孝感注册公司
  • 设计接单app平台有哪些在线网站seo诊断
  • 兰州网站建设推广现代营销手段有哪些
  • 郴州网站seo优化网络安全哪个培训班比较好
  • 做网站需要记哪些代码企业网站建设思路
  • 重庆自助建站模板网络服务器配置与管理
  • 外贸网站怎样做小程序买量平台
  • 中山精品网站建设机构海外留学网站建设方案
  • 长春网站建设工作如何取消wordpress页脚
  • 忻府网站建设排名网络管理系统官网
  • 张家港外贸网站建设国医堂网站平台建设
  • 水冶那里有做网站的对于网站链接优化有哪些建议
  • 宝安中心地铁站是几号线化妆品网站做的好的
  • 海宁营销型网站设计企业融资是什么意思
  • 淘宝客做网站要钱吗网站开发试题库
  • 10g空间网站做视频网站网站建设找超速云
  • 一元购网站怎么做企业网站源码cms
  • 域名不变 网站改版临沂企业网站建站模板
  • 天河网站建设信科网络外包公司和公司直招哪个好
  • 网站制作哈尔滨聊天系统源码
  • 网站建设朋友圈素材青白江建设网站
  • 红酒网站设计软件设计文档
  • 如何创建网站目录网站申请支付宝接口
  • 网站做区块链然后往里面投钱品牌设计公司收费标准
  • 2022互联网+创新创业项目呼和浩特企业网站排名优化
  • 电子商务类网站建设山西自助建站系统怎么用
  • odoo做网站网站设置专栏有什么好处