verilog语言的FPGA变速花样流水灯设计
更新时间:2024-06-15 09:07:01 阅读量: 综合文库 文档下载
基于XILINX--XSE500E型FPGA
的变速流水灯以及花样流水灯的verilog语言设计
摘要
临近大四毕业,诸多工科院校电子电科通信等专业会选择用FPGA项目作为课程设计的课题,笔者同样经历了这个过程,收获颇多,在此将设计成果在此分享,以帮助大家更好掌握FPGA设计。
FPGA种类繁多,时效性非常好,设计过程中十分注重实时性,在时间点控制上非常优秀。此次设计采用XILINX的XSE500E型芯片的开发板,芯片采用FG320型接口,速度级别-4。板载时钟50MHz,如需其他时钟周期,可采用IP核中的clocking,其中的 DCM可以实现变频,引入DCM,输入频率50MHz,输出频率填入需要的频率即可,之后进行实例化。此外,可以借助计数器进行延时减速,此次设计采用了计数器延时方法。
本次列举了四种流水灯相关设计:普通流水灯(向左和向右滚动),自动反复式流水灯(到最右端自动向左滚动,到左端自动向右滚动),花样流水灯,变速流水灯。
谢谢大家的支持!
正文
一,普通流水灯 1,建模思想
普通流水灯,可以向右滚动,到最右端返回最左端,也可以向左滚动,到最左端返回最右端。
普通流水灯模块涉及的端口有:clk,它是时钟输入,一般就是板载时钟,这里是50MHz,具体参照开发板说明。还有复位输入rst,高电平有效。此外就是led端口,这个端口有8根管脚,共8位,连接8个led灯。
采用verilog语言,端口定义格式如下:
module led(
input clk, input rst,
output reg[7:0] led //此行定义说明led端口既是驱动管脚的,又是寄存器 );
采用过程建模,这里不采用行为建模和功能建模,因为这个过程就是一个大循环,规律性极强。由于板载时钟50MHz,如果每个时钟周期都要滚动流水灯,那么速度是惊人的,人眼根本无法分辨。所以采用计数器延时,当计数达到约4千万时候,驱动系统进行动作,可以判断,也可以进行流水灯动作。
普通流水灯,需要判断流水灯是否到了尽头,如果到了尽头,需要回归起点。 每次上电之后,需要按一下复位,才能进行流水灯循环。
Rst的作用就是初始化,首先为led赋予一个初始状态,可以让一个灯循环,也可以让几个灯一起亮,一起循环。几个灯亮,关键在于rst初始化。
2,全部代码如下:这里列举右滚动流水灯
module led( //这行定义了模块名字为led input clk, input rst,
output reg[7:0] led );
reg [25:0] count; //延时计数器,这里是25位计数器,为32M。 always @(posedge clk) //每个时钟上升沿进行下面动作 if(rst)
led <= 8'b10000000; //复位初始化,只有一个灯亮着,这里做一个灯的流水灯,如 always @(posedge clk) 果做两个灯,就是11000000 If(reg[25] == 1) //计数满32M之后再进行下面动作,延时。 begin
If (led == 8’b00000001) //当滚动到尽头,回到左侧起始端 led <= 8’b10000000; else
led <= {led[0],led[7:1]} //右移,用并置符实现 end endmodule
左滚动可以很容易得出,在此不做详细解释,读者自行分析。 module led( //这行定义了模块名字为led
input clk, input rst,
output reg[7:0] led );
reg [25:0] count; //延时计数器,这里是25位计数器,为32M。 always @(posedge clk) //每个时钟上升沿进行下面动作 if(rst)
led <= 8'b00000001; //复位初始化,只有一个灯亮着,这里做一个灯的流水灯,如 always @(posedge clk) 果做两个灯,就是00000011 If(reg[25] == 1) //计数满32M之后再进行下面动作,延时。 begin
If (led == 8’b10000000) //当滚动到尽头,回到左侧起始端 led <= 8’b00000001; else
led <= {led[6:0],led[7]} //左移,用并置符实现 end endmodule 二,自循环流水灯
此代码引用自课堂实验的代码,非本人原创,在此分析一下。大家可以自行理解。每次上电,按一下rst复位键,流水灯出现一个或者几个灯亮起来,接下来按住run,则流水灯从左向右滚动,滚到最右,自动向左滚,滚到左侧,再向右滚动,周而复始。
1,建模思想
该模块一共有四个端口,led是驱动流水灯的8个管脚的端口,clk是板载50MHz时钟,rst是复位信号输入,run是控制流水灯开始滚动的信号。
该模块采用计数器延时,通过flag寄存器控制流动方向,flag为1时候左滚动,flag为0,向右滚动。滚动到位自行判断。
2,代码分析
module Led(clk,reset,run,led); input clk,reset,run; output reg[7:0] led; reg [22:0] count; reg [7:0] mled; reg flag; always@(posedge clk) if(count[22] == 1) count <= 0; else
count <= count+1; always@(posedge clk ) begin
if(count [22] == 1) if(reset) begin led <= 8'b0000_0001; //这里我们只让一个灯亮着,如果两个灯就是00000011 flag <= 1; //初始化默认向左滚动 end
else if(run ) //按下run之后才会滚动 if(flag) //左滚动状态 begin led <= {led[6:0],led[7]}; //左移 if(led == 8'b0111_0000) //移到左端,之后要向右滚动 flag <= 0; //控制向右滚动 else ; //使用空的else语句是为了避免产生锁存器 end else //flag==0即右滚状态 begin led <= {led[0],led[7:1]}; //右移 if(led == 8'b0000_1110) //右移到尽头,要控制左移 flag <= 1; //控制左移 else ; end else led <= led; //不按run的时候,led保持原来的状态,不动。 end endmodule
三,花样流水灯 1,建模思想
笔者逻辑思维有限,并非专职码农,写出的代码,只能保证可以实现效果,至于执行效率,你懂的。
不过,可读性肯定没问题,一看便懂。
Verilog采用了c语言的风格,要说C语言什么最难,数组?指针?结构体?链表?
NO!
是if .....else if.....else ......分支判断,尤其是嵌套,if嵌套可以把码农瞬间搞疯。 C语言的if下面要跟着{},括号里面的是一个整体,这还容易判断,可是verilog呢?连个括号都没有,根本无法判断谁跟谁是站在一起的。
所以,根据程序是个大循环的思想,我采用过程建模,同时依靠行为建模,判断每个时间点该做点什么,确定每个点的行为,组成时间循环。
没错,case语句此时此刻就显得和蔼可亲了。所以呢,我们采用case语句判断,依次判断。
下面分析一下代码:
注意case下面那些赋值语句中,0和1的位置,哪里是1,哪个灯就是亮的。 module led(
input clk,
output reg [5:0] led );
reg [24:0] count; reg [5:0] mod; always @(posedge clk)
if(count[24] == 0) count <= 0; else
count <= count + 1; always @(posedge clk)
if(count[24] == 0)
if( mod[5] == 1 ) //每次计数满了再行动,用来延时,另外,这里有个5位计数 mod <= 0; 器,说明这个循环一共有32个状态,每个状态由你做主 else
mod <= mod + 1; always @(posedge clk) begin
case (mod)
5'h00: led <= 8'b11000000; 5'h01: led <= 8'b01100000; 5'h02: led <= 8'b00110000; 5'h03: led <= 8'b00011000; 5'h04: led <= 8'b00001100; 5'h05: led <= 8'b00000110; 5'h06: led <= 8'b00000011; 5'h07: led <= 8'b00001100; 5'h08: led <= 8'b00110000; 5'h09: led <= 8'b01100000; 5'h0a: led <= 8'b11000000; 5'h0b: led <= 8'b00110000; 5'h0c: led <= 8'b00001100;
5'h0d: led <= 8'b00011000; 5'h0e: led <= 8'b00011000; 5'h0f: led <= 8'b00001100; 5'h10: led <= 8'b00001100; 5'h11: led <= 8'b00000110; 5'h12: led <= 8'b00000110; 5'h13: led <= 8'b00000011; 5'h14: led <= 8'b00000110; 5'h15: led <= 8'b00001100; 5'h16: led <= 8'b00011000; 5'h17: led <= 8'b00110000; 5'h18: led <= 8'b01100000; 5'h19: led <= 8'b11000000; 5'h1a: led <= 8'b01010000; 5'h1b: led <= 8'b01001000; 5'h1c: led <= 8'b01000100; 5'h1d: led <= 8'b01000010; 5'h1e: led <= 8'b10000001; 5'h1f: led <= 8'b01000010; default: led <= 5'h11; endcase end endmodule
再唠叨两句,这个段子虽然长,但是原理是万能的,32个状态位,因为mod寄存器有6位,如果mod寄存器只有4位,那么就只有8种状态。可以修改mod位数,来决定多少个装态,每个状态赋值不同,产生的花样也不同。
花样如何,你做主! 四,变速流水灯 1,建模思想
变速流水灯,技术含量那个高啊,折磨我足足好几天,最后无奈了,采取了列举法。我最怕什么if else了,没办法,笨是无法挽救的。
其实变速,你懂得,为什么快,因为每秒滚动一位,为什么慢,经过十几秒才滚动一次。每秒滚动一次,那么每个状态只停留一秒,十几秒滚动一位,那么一个状态要停留十几秒,所以,根据每个状态停留的时间不同,发生变速。
我们这里列举了越来越慢的方法,注意case语句后面的各赋值句。每个状态停留时间越长,那么速度就越慢。
2,源代码 odule led( input clk,
output reg [7:0] led );
reg [24:0] count; reg [7:0] mod;
正在阅读:
又到一年桂花季作文400字06-29
安慰和鼓励人的话语02-11
小学女生生青春期心理健康教育08-17
2013 高考英语增分锦囊(一) - 短文改错难点探析04-02
旺季取利 淡季取势03-24
一元线性回归模型习题与答案03-28
乙酸异戊酯的制备10-17
程民生:宋人生活水平及币值考察11-03
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 流水灯
- 变速
- 花样
- verilog
- 语言
- 设计
- FPGA
- 国际武术套路竞赛规则
- 3-4岁幼儿生活自理及习惯的养成
- 浙江工业职业技术学院 - 图文
- 我的论文An Analysis of the Character Portrayal in Oliver Twi
- 幼儿园安全保卫管理规章制度
- 连云港师范高等专科学校外语系教师顶岗实习文件
- 浙江省温州市十校联合体2010-2011学年高一下学期期末联考政治试
- 见证取样、送检抽样专项施工方案
- 河师大附中2018年决战中招数学模拟试卷九
- 怎样建立企业内训机制
- 《直线的方向向量与直线的向量方程》课堂导学
- 规范权力运行工作管理流程及风险防范
- 推荐九年级化学上册《第七单元燃料及其利用》复习课教案2新人教
- 冰心诗四首1
- 企业内训机制建立方案
- 重大危险源检测、评估、监控措施及应急救援预案
- 临时用电方案
- 硫酸的制备与性质
- 创业基础论文
- 南开大学2018春季《行政管理学》离线作业考核答案