VerilogHDL流水灯设计

合集下载

Verilog流水灯实验报告

Verilog流水灯实验报告

流水灯实验报告实验二 流水灯一、 实验目的学会编写一个简单的流水灯程序并掌握分频的方法。

熟悉Modelsim 仿真软件的使用。

二、 实验要求用Quartus 编写流水灯程序,在Modelsim 软件中进行仿真。

三、 实验仪器和设备1、 硬件:计算机2、 软件:Quartus 、Modelsim 、(UE )四、 实验内容1、 将时钟周期进行分频。

2、 编写Verilog 程序实现LED 等依次亮灭,用Modelsim 进行仿真,绘制波形图。

五、 实验设计(一)分频原理已知时钟周期f 为50MHz ,周期T 为1/f ,即20ns 。

若想得到四分频计数器,即周期为80ns 的时钟,需要把时钟进行分频。

即每四个时钟周期合并为一个周期。

原理图如图1所示。

rst_nclkclk_4图1 四分频原理图 (二)流水灯设计思路1、实现4盏LED灯依次隔1s亮灭,即周期为1s;2、计算出频率f为1/T=1Hz;3、设置计数器cnt,当检测到clk上升沿时开始计数,当cnt计数到24_999_999时,clk_4跳变为1,LED灯亮起,当cnt计数49_999_999时,clk_4置0,LED灯熄灭。

4、给LED赋初值4’b0001,第一盏灯亮。

5、利用位拼接,实现循环。

(三)设计框图图2 设计基本框图(四)位拼接的用法若输入a=4'b1010,b=3'b101,c=4'b0101,想要使输出d=5'b10001用位拼接,符号“{ }”:d<={b[2:1],c[1],a[2:1]}即把b的低1~2位10,c的低1位0,a的低1~2位01拼接起来,得到10 0 01。

流水灯4'b00014'b00104'b01004'b1000相当于把低三位左移,并最高位放在最低位。

用位拼接可写为:led<={led[2:0], led[3]};低三位最高位六、实验方法和步骤(一)时钟分频1、编写分频程序。

verilog- HDL实现流水灯

verilog- HDL实现流水灯

用verilog实现流水灯module flow_deng(input wire pin_clk_in,input wire pin_rest_n ,input wire [1:0] pin_ctrl,output reg [7:0] pin_led_out);wire clk ;reg [31: 0] counter32;//fen pingalways @ (posedge pin_clk_in or negedge pin_rest_n) begin if(pin_rest_n==1'b0) begincounter32 <= 32'b0;endelse begincounter32 <= counter32+1'b1;endendassign clk = counter32[3] ; //16 fen pinreg [4:0] state;parameter [4:0] IDLE =5'b0_0001;parameter [4:0] RIGHT =5'b0_0010;parameter [4:0] LEFT =5'b0_0100;parameter [4:0] DOUB_LEFT =5'b0_1000;parameter [4:0] ERROR =5'b1_0000;reg [4:0] cur_sta;always @ (posedge clk or negedge pin_rest_n) begin if(pin_rest_n==1'b0) beginstate <= IDLE ;endelse begincase (state)IDLE : beginif (pin_ctrl==2'b00) beginstate <= LEFT ;endelse if (pin_ctrl==2'b01) beginstate <= RIGHT ;endelse if (pin_ctrl==2'b10) beginstate <= DOUB_LEFT ;endelse beginstate <= ERROR ;endendLEFT : beginif (pin_ctrl==2'b00) beginstate <= LEFT ;endelse if (pin_ctrl==2'b01) beginstate <= RIGHT ;endelse if (pin_ctrl==2'b10) beginstate <= DOUB_LEFT ;endelse beginstate <= ERROR ;endendRIGHT : beginif (pin_ctrl==2'b00) beginstate <= LEFT ;endelse if (pin_ctrl==2'b01) beginstate <= RIGHT ;endelse if (pin_ctrl==2'b10) beginstate <= DOUB_LEFT ;endelse beginstate <= ERROR ;endendDOUB_LEFT : beginif (pin_ctrl==2'b00) beginstate <= LEFT ;endelse if (pin_ctrl==2'b01) beginstate <= RIGHT ;endelse if (pin_ctrl==2'b10) beginstate <= DOUB_LEFT ;endelse beginstate <= ERROR ;endendERROR : beginif (pin_ctrl==2'b00) beginstate <= LEFT ;endelse if (pin_ctrl==2'b01) beginstate <= RIGHT ;endelse if (pin_ctrl==2'b10) beginstate <= DOUB_LEFT ;endelse beginstate <= ERROR ;endenddefault: state <= IDLE ;endcaseendendalways @ (posedge clk or negedge pin_rest_n) beginif (pin_rest_n == 1'b0) beginpin_led_out[7:0]<=8'b0000_0000 ;endelse begincase (state)IDLE : beginpin_led_out [7:0] <=8'b0000_0000 ;endLEFT : beginif((pin_led_out[0]+pin_led_out[1]+pin_led_out[2]+pin_led_out[3]+pin_led_out[4]+pin_led_out[5]+pin_led_out[6]+pin_led_out[7])!=8'd1 ) beginpin_led_out[7:0] <= 8'b0000_0001;endelse beginpin_led_out[7:1] <= pin_led_out[6:0];pin_led_out[0] <= pin_led_out[7];endendRIGHT : beginif((pin_led_out[0]+pin_led_out[1]+pin_led_out[2]+pin_led_out[3]+pin_led_out[4]+pin_led_out[5 ]+pin_led_out[6]+pin_led_out[7])!=8'd1 ) beginpin_led_out [7:0] <= 8'b0000_0001 ;endelse beginpin_led_out [6:0] <= pin_led_out [7:1] ;pin_led_out [7] <= pin_led_out [0] ;endendDOUB_LEFT : beginif((pin_led_out[0]+pin_led_out[1]+pin_led_out[2]+pin_led_out[3]+pin_led_out[4]+pin_led_out[5] +pin_led_out[6]+pin_led_out[7])!=8'd2 ) beginpin_led_out [7:0] <= 8'b0000_0011 ;endelse beginpin_led_out [7:1] <= pin_led_out [6:0] ;pin_led_out [0] <= pin_led_out [7] ;endendERROR : beginpin_led_out [7:0]<=8'b1111_1111;enddefault : pin_led_out [7:0] <= 8'b0000_0000;endcaseendendendmodule。

基于FPGA的流水灯

基于FPGA的流水灯

基于FPGA的流水灯概述流水灯是一种常见的电子实验项目,也是学习数字电路和FPGA编程的入门项目之一。

本文介绍了如何使用FPGA实现一个基于流水灯的电子项目。

需求流水灯项目的主要需求是将一组LED灯以一定的速率顺序点亮,然后逐个熄灭,再以同样的速率顺序点亮下一个LED 灯,如此循环。

硬件设计FPGA板在本项目中,我们使用一块支持FPGA编程的开发板。

可选的FPGA开发板包括Xilinx的Nexys 4或Digilent的Basys 3等。

LED灯流水灯需要一组LED灯来显示效果。

我们将使用FPGA开发板上的LED灯作为显示单元。

连接将LED灯的阳极连接到FPGA开发板的GPIO引脚上,并将其地连接到电路板上的公共地线。

软件设计硬件描述语言(HDL)HDL是一种用于描述数字电路和FPGA的语言。

常用的HDL包括VHDL和Verilog。

我们将使用Verilog作为本项目的HDL语言。

Verilog代码下面是一个基于FPGA的流水灯的Verilog代码示例:module led_shifter(input clk,output reg [7:0] leds);reg [25:0] counter;always @(posedge clk) begincounter <= counter + 1;if (counter == 26'd255) begincounter <= 0;leds <= leds << 1;endendendmodule上述Verilog代码中,我们定义了一个led_shifter模块,该模块接受一条时钟信号(clk)和一个用于控制LED灯的8位寄存器(leds)。

leds寄存器表示LED灯的状态,其中每个位代表一个LED灯。

在always块中,我们使用一个计数器counter来计算时钟脉冲的数量。

当计数器的值达到255时,即过了一定的时钟周期,我们将计数器重置为0,并将leds寄存器向左移动一位,即将下一个LED灯点亮。

Verilog流水灯实验报告.pptx

Verilog流水灯实验报告.pptx
reg rst_n; reg cnt; wire led;
initial begin clk = 0; rst_n = 0; #100 rst_n = 1; end
always #5 clk=~clk;
LSD LSD_inst( .clk(clk), .rst_n(rst_n),
学海无 涯
流水灯实验报告
实验二 流水灯
一、 实验目的
学会编写一个简单的流水灯程序并掌握分频的方法。熟悉 Modelsim 仿真软件的使用。
二、 实验要求
用 Quartus 编写流水灯程序,在 Modelsim 软件中进行仿真。
三、 实验仪器和设备
1、 硬件:计算机 2、 软件:Quartus、Modelsim、(UE)
四、 实验内容
1、 将时钟周期进行分频。 2、 编写 Verilog 程序实现 LED 等依次亮灭,用 Modelsim 进行仿真,绘制波形图。
五、 实验设计
(一)分频原理 已知时钟周期f 为 50MHz,周期 T 为 1/f,即 20ns。若想得到四分频计数器,即周期为 80ns 的时钟,需要把时钟进行分频。即每四个时钟周期合并为一个周期。原理图如图 1 所示。
1
学海无 涯
clk LED
LED
FPGA
cnt
图 2 设计基本框图
(四)位拼接的用法 若输入 a=4'b1010,b=3'b101,c=4'b0101,想要使输出 d=5'b10001 用位拼接,符号“{ }”:d<={b[2:1],c[1],a[2:1]} 即把 b 的低 1~2 位 10,c 的低 1 位 0,a 的低 1~2 位 01 拼接起来,得到 10 0 01。 流水灯

verilog实验报告流水灯数码管秒表交通灯

verilog实验报告流水灯数码管秒表交通灯

流水灯实验目的:在basys2开发板上实现LED灯的花样流水的显示,如隔位显示,依次向左移位显示,依次向右移位显示,两边同时靠中间显示。

实验仪器:FPGA开发板一块,计算机一台。

实验原理:当一个正向的电流通过LED时,LED就会发光。

当阳极的电压高于阴极的电压时,LED就会有电流通过。

当在LED上增添一个典型值为1.5V—2.0V之间的电压时,LED就会有电流通过并发光。

实验内容:顶层模块:输入信号:clk_50MHz(主时钟信号),rst(重置信号),输出信号:[7:0] led(LED灯控制信号)。

module led_top(clkin,rst,led_out);input clkin, rst;output [7:0] led_out;wire clk_1hz;divider_1hz d0(clkin, rst, clk_1hz);led l0(clk_1hz, rst, led_out);endmodule分频模块:module divider_1hz(clkin,rst,clkout);input clkin,rst;output reg clkout;reg [24:0] cnt;always@(posedge clkin, posedge rst)beginif(rst) begincnt<=0;clkout<=0; endelse if(cnt==24999999) begincnt<=0;clkout=!clkout; endelse cnt<=cnt+1;endendmodule亮灯信号模块:module led(clkin,rst,led_out);input clkin,rst;output [7:0] led_out;reg [2:0] state;always@(posedge clkin, posedge rst)if(rst) state<=0;else state<=state+1;always@(state)case(state)3'b000:ledout<=8'b0000_0001;3'b001:ledout<=8'b0000_0010;3'b010:ledout<=8'b0000_0100;3'b011:ledout<=8'b0000_1000;3'b100:ledout<=8'b0001_0000;3'b101:ledout<=8'b0010_0000;3'b110:ledout<=8'b0100_0000;3'b111:ledout<=8'b1000_0000;endcaseendmodule实验中存在的问题:1 芯片选择问题automotive spartan3EXA3S100E XA3S250E CPG132spartan3EXC3S100E XC3S250E CP1322 时序逻辑部分,阻塞赋值和非阻塞赋值混用always@(posedge clk)begina=b+c;d<=e+f;end3 UCF文件格式错误NET “CLK” LOC = “B8”;NET “a” LOC = “N11”;NET “b” LOC = “G13”;NET “c[0]”LOC =“K11;数码管实验目的:设计一个数码管动态扫描程序,实现在四位数码管上动态循环显示“1”、“2”“3”“4”;实验仪器:FPGA开发板一块,计算机一台。

verilogCPLD流水灯课程设计

verilogCPLD流水灯课程设计

verilogCPLD流水灯课程设计一、课程目标知识目标:1. 学生理解Verilog HDL基本语法和结构,掌握CPLD的基本原理和使用方法。

2. 学生能够描述流水灯的工作原理,并运用Verilog HDL编写程序实现流水灯的功能。

3. 学生了解数字电路设计中时序控制的重要性,并掌握基本时序电路的设计方法。

技能目标:1. 学生能够使用Verilog HDL进行基本程序编写,具备CPLD程序烧录和调试的能力。

2. 学生通过课程实践,培养动手操作能力,提高问题解决能力。

3. 学生能够运用所学知识,进行小组合作,完成流水灯课程的综合性设计。

情感态度价值观目标:1. 学生培养对电子设计的兴趣,增强学习主动性和积极性。

2. 学生在课程实践中,培养团队合作精神,提高沟通与协作能力。

3. 学生认识到电子技术在日常生活中的应用,激发创新意识和实践欲望。

课程性质:本课程为电子技术实践课程,以培养学生的实际操作能力和综合设计能力为主。

学生特点:学生已具备一定的电子技术基础知识,对Verilog HDL和CPLD有一定了解,但实际操作能力有待提高。

教学要求:结合学生特点,注重理论与实践相结合,提高学生的动手能力和创新意识。

在教学过程中,强调团队合作,培养学生沟通协作能力。

通过课程目标的实现,使学生能够独立完成流水灯的设计与实现。

二、教学内容1. Verilog HDL基础语法与结构复习:重点回顾数据类型、运算符、控制语句等基本概念,确保学生能够熟练运用Verilog进行编程。

教材章节:第二章Verilog HDL基础2. CPLD基本原理与使用方法:介绍CPLD的内部结构、工作原理以及编程方法,使学生了解并掌握CPLD的基本使用。

教材章节:第三章CPLD/FPGA原理与应用3. 流水灯工作原理与设计:详细讲解流水灯的工作原理,分析设计思路,指导学生进行Verilog程序编写。

教材章节:第四章数字电路设计实例4. 时序控制与基本时序电路设计:探讨时序控制的重要性,教授基本时序电路的设计方法,为流水灯设计提供技术支持。

基于FPGA的流水灯

基于FPGA的流水灯

基于FPGA的流水灯介绍流水灯(Traffic Light)是一种常见的电子实验项目,通过一组灯的亮灭变化来模拟交通信号灯的工作原理。

在本文档中,我们将介绍如何使用FPGA(Field-Programmable Gate Array)来实现流水灯功能。

背景知识FPGA概述FPGA是一种重新可编程的集成电路芯片,可以通过修改内部逻辑电路来实现不同的功能。

相比于传统的固定功能芯片,FPGA具有更高的灵活性和可重构能力。

流水灯原理流水灯由多个灯泡组成,每个灯泡在不同的时间点亮。

通过逐个点亮和熄灭灯泡,可以模拟交通信号灯的变化效果。

硬件设计硬件平台选择在本项目中,我们选择使用一块FPGA开发板作为硬件平台。

开发板上集成了FPGA芯片以及所需的外围器件,方便我们进行流水灯的实验。

硬件连接将FPGA开发板上的LED灯连接到FPGA芯片的GPIO(通用输入输出)引脚上。

通过配置FPGA芯片的GPIO引脚为输出模式,我们可以控制LED灯的亮灭状态。

软件设计硬件描述语言(HDL)为了描述FPGA中的逻辑电路,我们需要使用一种称为硬件描述语言(Hardware Description Language)的工具。

常用的硬件描述语言有Verilog和VHDL两种。

Verilog代码示例以下是一个使用Verilog描述的简单流水灯控制器的例子:module led_controller (input wire clk, // 时钟输入output wire [7:0] led // LED灯控制输出);reg [25:0] counter; // 计数器always @(posedge clk) beginif (counter == 0)led <= 8'h01; // 第一个灯亮else if (counter == 500000)led <= 8'h02; // 第二个灯亮else if (counter == 1000000)led <= 8'h04; // 第三个灯亮else if (counter == 1500000)led <= 8'h08; // 第四个灯亮else if (counter == 2000000)led <= 8'h10; // 第五个灯亮else if (counter == 2500000)led <= 8'h20; // 第六个灯亮else if (counter == 3000000)led <= 8'h40; // 第七个灯亮else if (counter == 3500000)led <= 8'h80; // 第八个灯亮counter <= counter + 1'b1;endendmodule在该代码中,我们定义了一个8位宽的led输出端口和一个26位宽的计数器。

FPGA入门系列实验教程——流水灯

FPGA入门系列实验教程——流水灯

FPGA入门系列实验教程——LED流水灯1.实验任务让实验板上的8个LED实现流水灯的功能。

通过这个实验,进一步掌握采用计数与判断的方式来实现分频的Verilog HDL的编程方法以及移位运算符的使用。

2.实验环境硬件实验环境为艾米电子工作室型号EP2C8Q208C8增强版开发套件。

软件实验环境为Quartus II8.1开发软件。

3.实验原理流水灯,顾名思义就是让LED象水一样的点亮。

如果把流水做慢动作播放,可以想象到其实就是移动,即:把水块不断地向同一方向移动,而原来的水块保持不动,就形成了流水。

同样,如果使得最左边的灯先亮;然后,通过移位,在其右侧的灯,由左向右依次点亮,而已经亮的灯又不灭,便形成了向右的流水灯。

初始状态时,8个灯都不亮。

每来一个时钟脉冲CLK,计数器就加1。

每当判断出计数器中的数值达到25000000时,就会点亮一个灯,并进行移位。

FPGA输出的数据就应该首先是10000000,隔1秒钟变成11000000……一直变化到11111111,这样,依次点亮所有的灯,就形成了流水灯。

而当8个灯都点亮时,需要一个操作使得所有的灯恢复为初始状态,即:灯都不亮。

然后,再一次流水即可。

如果是右移位,就出现向右流水的现象;反之,向左流水。

4.实验程序module ledwater(clk,led);//模块名及端口参数output[7:0]led;//输出端口定义input clk;//输入端口定义,50M时钟reg[8:0]led_out;//变量led_out定义为寄存器型reg[8:0]led_out1;//变量led_out1定义为寄存器型reg[25:0]buffer;//中间变量buffer定义为寄存器型always@(posedge clk)beginbuffer=buffer+1;if(buffer==26'd2*******)//判别buffer数值为25000000时,做输出处理beginled_out=led_out<<1;//led向左移位,空闲位自动添0补位if(led_out==9'b000000000)led_out=9'b111111111;led_out1=~led_out;//取反输出endendassign led=led_out1[7:0];endmodule5.实验步骤(1)建立新工程项目:打开Quartus II软件,进入集成开发环境,点击File→New project wizard建立一个工程项目ledwater。

[Keil][Verilog][微机原理]流水灯、存储器、外部中断实验_北京邮电大学计算机。。。

[Keil][Verilog][微机原理]流水灯、存储器、外部中断实验_北京邮电大学计算机。。。

[Keil][Verilog][微机原理]流⽔灯、存储器、外部中断实验_北京邮电⼤学计算机。

计算机原理与应⽤实验-流⽔灯、存储器、外部中断实验1 实验⼀流⽔灯实验1.1 实验⽬的1. 掌握ARM开发⼯具的使⽤。

2. 掌握基本IO的使⽤。

1.2 实验原理及内容1. 电路结构图实现流⽔灯的电路结构图如图1所⽰。

以两条红⾊虚线为界,从左⾄右第⼀部分为ARM系统部分,第三部分为外围电路,第⼆部分是接⼝部分,需要⾃⼰将其连接。

图 1 流⽔灯的电路结构图接线⽅式为:GPIOF_0~GPIOF_7(P12接⼝)接LED1~LED8(P2接⼝)。

1. LED电路原理LED灯的驱动原理如图2所⽰。

当发光⼆极管正向导通时,LED灯点亮。

图 2 LED灯正向导通如图3所⽰,LED灯与MCU引脚连接,MCU IO额定电流为25mA,例如0603封装红⾊LED灯额定电流为20mA,已经接近MCU IO的额定电流,可能会损毁器件。

因此图1.3微控制器驱动LED灯⽅案不可取。

图 3 微控制器驱动 LED 灯实际微控制驱动LED灯的电路模型包括:控制器、驱动器和执⾏器三部分,控制器提供控制信号,再由驱动器驱动执⾏器,如图4所⽰。

图 4 LED 灯去驱动电路模型如图5所⽰LED灯通过N沟道MOS管驱动,MCU IO输出⾼电平时MOS管漏极和源极导通LED灯被点亮,反之MCU输出低电平时MOS管漏极和源极截⽌,LED灯不能被点亮。

假设VCC电压3.3V,MOS管导通阻值为零,通过LED灯的电流将远超额定电流出现短路现象,故此⽅案不可取。

图 5 MOS 管驱动 LED 灯电路如图6所⽰,LED驱动电路中增加电阻(R),以此保证通过LED灯的电流不超过额定电流,避免损坏器件,故将电阻R称为限流电阻。

图 6 限流电阻如图7所⽰LED电路原理图,R1位置电阻作为限流电阻,R29位置电阻作为下拉电阻,避免MOS管栅极出现亚稳态。

图 7 LED 电路原理图1. 微控制器IO输出控制原理如图8所⽰,基本结构针对STM32F407有7组IO。

开发板上基于VERILOG编程语言实现流水灯控制(仿交通灯)

开发板上基于VERILOG编程语言实现流水灯控制(仿交通灯)

大规模数字电路课程设计设计题目:交通信号灯专业电子信息科学与技术班级电信091学号200916022108学生姓名陈恩雄设计时间2011-2012学年上学期教师评分2011年12月5日目录一、实验目的: (2)二、实验器材: (2)三、实验步骤 (2)四、设计思路及实现方法 (3)(1)设计思路 (3)(2)实现方法 (3)①分频器 (3)②状态控制 (4)(3)开发板管脚分配 (4)五、程序代码 (5)六、实验过程及结果 (8)1、在线调试: (8)2、管脚分配: (9)3、开发板截图: (9)七、设计总结与体会 (11)设计中遇到的问题及解决方法 (11)个人体会 (11)一、实验目的:1、系统功能:实现十字路口的交通灯显示。

2、系统要求:(1)要求控制南北、东西方向各3个灯(红、黄、绿)的亮灭;(2)要求绿灯转红灯前,黄灯亮两秒;(3)要求南北向红灯亮16秒,同时东西向绿灯亮14秒,东西向绿灯转红灯前,黄灯亮亮秒;南北向红灯直接转成绿灯亮14秒,此时,东西向红灯亮16秒。

,3.、熟悉程序设计的基本流程4.、熟悉开发板的应用5、进一步巩固所学语言的熟练度二、实验器材:1.计算机、quartusⅡ软件2.实验开发板三、实验步骤1,构思模块以及程序结构2.分析程序结构3.编写程序4.程序的调试5.在开发板上试验程序四、设计思路及实现方法(1)设计思路使用Verilog语言,控制实验开发板LED灯LED0~LED7。

其中led0~led2分别表示东西向红、黄、绿灯;led3~led5分别表示南北向红、黄、绿灯;led6不使用、led7每秒闪烁一次便于观察时间。

(2)实现方法①分频器分频器实现的是将高频时钟信号转换成低频时钟信号,用于触发控制器、计数器和扫描显示电路。

②状态控制使用Verilog语言控制6个红绿灯的4种状态:(3)开发板管脚分配Node Name Direction Location clk_in Input PIN_L1 led[7] Output PIN_AA18 led[6] Output PIN_W15 led[5] Output PIN_AA17 led[4] Output PIN_U14 led[3] Output PIN_AA16 led[2] Output PIN_Y13led[1] Output PIN_V14led[0] Output PIN_W16五、程序代码// 分频器部分,获得便于试验观察的时钟信号module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0] counter; //50_000_000=1011_1110_1011_1100_0010_0000_00parameter cnt=50_000_000; // 50MHz is the sys clk,50_000_000=2FAF080 always @(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule//主程序module JTD(clk,led);input clk;output[7:0]led;reg[7:0]led;reg[4:0]state;always @ (posedge clk)begin state = state + 5'b00001;case(state)5'b00000:led<=8'b1x100001; //南北红,东西绿,持续14秒5'b00001:led<=8'b0x100001;5'b00010:led<=8'b1x100001;5'b00011:led<=8'b0x100001;5'b00100:led<=8'b1x100001;5'b00101:led<=8'b0x100001;5'b00110:led<=8'b1x100001;5'b00111:led<=8'b0x100001;5'b01000:led<=8'b1x100001;5'b01001:led<=8'b0x100001;5'b01010:led<=8'b1x100001;5'b01011:led<=8'b0x100001;5'b01100:led<=8'b1x100001;5'b01101:led<=8'b0x100001;5'b01110:led<=8'b1x100010; //南北红,东西黄,持续2秒5'b01111:led<=8'b0x100010;5'b10000:led<=8'b1x001100; //南北绿,东西红,持续14秒5'b10001:led<=8'b0x001100;5'b10010:led<=8'b1x001100;5'b10011:led<=8'b0x001100;5'b10100:led<=8'b1x001100;5'b10101:led<=8'b0x001100;5'b10110:led<=8'b1x001100;5'b10111:led<=8'b0x001100;5'b11000:led<=8'b1x001100;5'b11001:led<=8'b0x001100;5'b11010:led<=8'b1x001100;5'b11011:led<=8'b0x001100;5'b11100:led<=8'b1x001100;5'b11101:led<=8'b0x001100;5'b11110:led<=8'b1x010100; //南北黄,东西红,持续2秒5'b11111:led<=8'b0x010100;endcaseendendmodule六、实验过程及结果1、在线调试:2、管脚分配:3、开发板截图:状态①南北红,东西绿,持续14秒状态②南北红,东西黄,持续2秒状态③南北绿,东西红,持续14秒状态④南北黄,东西红,持续2秒七、设计总结与体会设计中遇到的问题及解决方法对verilogHDL语言不够熟悉,想到控制方法,但是没办法实现,只能重新回顾书上的知识,寻找合适的控制语句。

verilog程序-流水灯

verilog程序-流水灯

/****************************************************程序功能:流水灯版本:1.1 版权:分享快乐*****************************************************/ module liu_shui_deng(input wire pin_clk_in,input wire pin_rest_n ,input wire [1:0] pin_ctrl,output reg [7:0] pin_led_out);wire clk ;reg [31: 0] counter32;always @ (posedge pin_clk_in or negedge pin_rest_n) begin if(pin_rest_n==1'b0) begincounter32 <= 32'b0;endelse begincounter32 <= counter32+1'b1;endendassign clk = counter32[3] ;reg [2:0] cur_sta,stateparameter [2:0] IDLE =3'b000;parameter [2:0] RIGHT =5'b001;parameter [2:0] LEFT =5'b010;parameter [2:0] DOUB_LEFT =5'b011;parameter [2:0] ERROR =5'b100;always @ (posedge clk or negedge pin_rest_n) beginif(pin_rest_n==1'b0) beginstate <= IDLE ;endelse begincase (state)IDLE : beginif (pin_ctrl==2'b00) beginstate <= LEFT ;endelse if (pin_ctrl==2'b01) beginstate <= RIGHT ;endelse if (pin_ctrl==2'b10) beginendelse beginstate <= ERROR ;endendLEFT : beginif (pin_ctrl==2'b00) beginstate <= LEFT ;endelse if (pin_ctrl==2'b01) begin state <= RIGHT ;endelse if (pin_ctrl==2'b10) begin state <= DOUB_LEFT ;endelse beginstate <= ERROR ;endendRIGHT : beginif (pin_ctrl==2'b00) beginstate <= LEFT ;endelse if (pin_ctrl==2'b01) begin state <= RIGHT ;endelse if (pin_ctrl==2'b10) begin state <= DOUB_LEFT ;endelse beginstate <= ERROR ;endendDOUB_LEFT : beginif (pin_ctrl==2'b00) beginstate <= LEFT ;endelse if (pin_ctrl==2'b01) begin state <= RIGHT ;endelse if (pin_ctrl==2'b10) beginendelse beginstate <= ERROR ;endendERROR : beginif (pin_ctrl==2'b00) beginstate <= LEFT ;endelse if (pin_ctrl==2'b01) beginstate <= RIGHT ;endelse if (pin_ctrl==2'b10) beginstate <= DOUB_LEFT ;endelse beginstate <= ERROR ;endenddefault: state <= IDLE ;endcaseendendalways @ (posedge clk or negedge pin_rest_n) beginif (pin_rest_n == 1'b0) beginpin_led_out[7:0]<=8'b0000_0000 ;endelse begincase (state)IDLE : beginpin_led_out [7:0] <=8'b0000_0000 ;endLEFT : beginif((pin_led_out[0]+pin_led_out[1]+pin_led_out[2]+pin_led_out[3]+pin_led_out[4]+pin_led_out[5]+pin_led_out[6]+pin_led_out[7])!=8'd1 ) beginpin_led_out[7:0] <= 8'b0000_0001;endelse beginpin_led_out[7:1] <= pin_led_out[6:0];pin_led_out[0] <= pin_led_out[7];endendRIGHT : beginif((pin_led_out[0]+pin_led_out[1]+pin_led_out[2]+pin_led_out[3]+pin_led_out[4]+pin_led_out[5]+pin_led_out[6]+pin_led_out[7])!=8'd1 ) beginpin_led_out [7:0] <= 8'b0000_0001 ;endelse beginpin_led_out [6:0] <= pin_led_out [7:1] ;pin_led_out [7] <= pin_led_out [0] ;endendDOUB_LEFT : beginif((pin_led_out[0]+pin_led_out[1]+pin_led_out[2]+pin_led_out[3]+pin_led_out[4]+pin_led_out[5]+pin_led_out[6]+pin_led_out[7])!=8'd2 ) beginpin_led_out [7:0] <= 8'b0000_0011 ;endelse beginpin_led_out [7:1] <= pin_led_out [6:0] ;pin_led_out [0] <= pin_led_out [7] ;endendERROR : beginpin_led_out [7:0]<=8'b1111_1111;enddefault : pin_led_out [7:0] <= 8'b0000_0000;endcaseendendendmodule。

Verilog流水灯设计_SegLed

Verilog流水灯设计_SegLed

SEGLED详细设计方案1.SEGLED简介:数码管由七个条状和一个点状发光二极管管芯制成,称为七段数码管。

数码管是一类价格便宜、使用简单,通过对其不同的管脚输入相对的电流,使其发亮,从而显示出数字能够显示时间、日期、温度等所有可用数字表示的参数的器件。

在电器特别是家电领域应用极为广泛,如显示屏、空调、热水器、冰箱等等。

绝大多数热水器用的都是数码管,其他家电也用液晶屏与荧光屏。

2.SEGLED规格:编写逻辑使七段数码管计数从0-9循环计数。

3.SEGLED方案目的:1、使学生掌握数码管的原理和使用方法。

2、使学生掌握利用FPGA的I/O口控制数码管原理和使用方法。

4.SEGLED硬件方案:5.实现原理七段数码管实物图片:七段数码管原理:拿显示8举例子;1 1 1 0 1 1 1 1 对应:e gf dp c d b a数码管类型:根据其结构的不同,可分为共阳极数码管和共阴极数码管两种。

共阳共阴,是针对数码管的公共脚而说的。

典型的一位数码管,一般有10个脚,8个段码(7段加1个小数点),剩下两个脚接在一起。

各个段码实际上是一个发光二极管,既然是发光二极管,就有正负极。

共阳,也就是说公共脚是正极(阳极),所有的段码实际上是负极,当某一个或某几个段码位接低电平,公共脚接高电平时,对应的段码位就能点亮,进而组合成数字或字母。

共阴是公共脚是负极(阴极),段码位是阳极,当公共脚接地,段码位接高电平时,对应段码位点亮。

一位数码管就是这样,多位的数码管原理类似。

LED数码管中各段发光二极管的伏安特性和普通二极管类似,只是正向压降较大,正向电阻也较大。

在一定范围内,其正向电流与发光亮度成正比。

由于常规的数码管起辉电流只有1~2 mA,最大极限电流也只有10~30 m A。

共阴共阳与电路接线密切相关,决定了驱动电路的接法,因此在电路设计前要考虑好数码管的类型,否则就不能实现显示的效果了。

共阳极的比较容易驱动,共阴极的比较好编程。

流水灯verilog设计代码

流水灯verilog设计代码
end
else if (pin_ctrl==3'b011) begin
state <= DDOUB_RIGHT ;
if (pin_ctrl==3'b000) begin
state <= LEFT ;
end
else if (pin_ctrl==3'b001) begin
else if (pin_ctrl==3'b001) begin
state <= RIGHT ;
end
else if (pin_ctrl==3'b010) begin
end
RIGHT : begin
if (pin_ctrl==3'b000) begin
state <= LEFT ;
end
ERROR : begin
if (pin_ctrl==3'b000) begin
counter32 <= 32'b0;
end
else begin
counter32 <= counter32+1'b1;
end
end
assign clk = counter32[3] ; //16 fen pin
else if (pin_ctrl==3'b011) begin
state <= DDOUB_RIGHT ;
end
end
else begin
state <= ERROR ;
end
else if (pin_ctrl==3'b011) begin
state <= DDOUB_RIGHT ;

FPGA流水灯实验

FPGA流水灯实验
通过流水灯的实验实现了串行工作,流水线工作(时间并行),并 行流水线工作(空间并行)。串行工作是 CPU 的工作方式,也就是一 个时间只能做一件事。通过 verilogHDL 完全可以模仿这种工作方式, 也就是说通过 CPU 实现的算法和驱动程序完全可以转换成对应的 verilogHDL。并且结构化程序设计的思想(顺序,选择,循环)也可 以通过 verilogHDL 实现。除了串行工作外,verilogHDL 还有 CPU 很 难实现的流水线(时间并行)和并行处理(空间并行)的优势。当然 现在的多核 CPU 通过多线程编程也可以实现并行处理,但实现相对比 较复杂。FPGA 只要逻辑资源足够多,理论上可以实现无限并行处理。
编写代码的首要任务是管理复杂度,研究表明人能同时关注的智 力模型为 7+2,而嵌套关注通常不超过 5 层。编写一段代码的同时关 注点很容易会超过 9 个。通过智力训练提供关注智力模型数的效果微 乎其微。所以为了能编写任意大规模的代码,把同一时间关注的智力 模型数降低的方法是很有效的。而且软件工程也是在制定相关的编程 规范,对编程限制的基础上发展起来的。VerilogHDL 虽然是硬件描述 语言,但它已经摆脱了原始的电路图输入的方式,具有更高的抽象性, 所以它应该可以应该软件开发中的类似的结论来提高开发效率。就像 高级语言相对于 01 机器码编程一样。我觉得在 verilogHDL 在模仿顺 序操作上更像汇编语言,因为它没有实现顺序,选择,循环结构的相
10
了对 Led_Driver 更高层次的操作,使得操作每个 LED 站在了抽象层, 而不是是底层。
在底层你需要考虑定时器翻转多少次才能到这个时间,然后还要 用这个时间打开或关闭 LED,这样需要考虑的问题很复杂也容易出错。 在抽象层你只需要给什么时候打开或关闭 LED 就够了,它就会自动的 完成翻转工作。抽象性也是人脑处理信息的方式,例如自己的家你甚 至说不清门是什么颜色的,门的把手是什么样式的。人脑对门的处理 是抽象的,它是一个可以开和关的门。你只需要知道这个就可以进入 家中,根本不需要记得门的颜色是什么。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

大规模数字逻辑题目:流水灯控制
专业电子信息科学与技术
班级
学号
学生姓名
设计时间
教师评分
"
2013年 12 月 10 日
目录
~
一、概述 0
二、设计目的 0
三、设计内容 0
四、设计原理图 0
五、引脚分配情况 (1)
六、源程序代码 (1)
VerilogHDL 程序: (1)
分频器部分: (1)
[
七、心得体会 (1)
八、参考文献 (1)
一、概述
流水灯是一串按一定的规律像流水一样连续闪亮,流水灯控制是可编程控制器的一个应用,其控制思想在工业控制技术领域也同样适用。

流水灯控制可用多种方法实现,但对现代可编程控制器而言,基于EDA技术的流水灯设计也是很普遍的。

二、设计目的
1、熟悉利用Quartus II 开发数字电路的基本流程和Quartus II 软件的相关操作。

2、掌握基本的设计思路,软件环境参数配置,仿真,管脚分配,利用JTAG/AS 进行下载等基本操作。

3、了解VerilogHDL 语言设计或原理图设计方法。

4、通过本此设计,了解流水灯的工作原理,掌握其逻辑功能及设计方法。

三、设计内容
1、用VerilogHDL语言设计一个流水灯,输入0的时候led~led7,1Hz正向流水3次,然后全亮;然后2Hz逆向流水5次全亮;循环。

输入1的时候led0~led7,奇数流水2次,全亮,1Hz偶数流水4次,全亮,然后循环。

2、用QuartusII 软件进行编译,仿真,下载到实验平台进行验证。

四、设计原理图
en为可调输入,输出为8位数据,为流水灯实验,试用8个LED指示灯来表示,具体引脚分配见下。

五、引脚分配情况
六、源程序代码
VerilogHDL 程序:
module LED( clk,led,en );
input clk;
input en;
output [7:0]led;国大学生电子设计获奖作品汇编[J].北京理工大学出版社,2005。

[2] 康华光 .电子技术基础-数字部分[M].高等教育出版社,1998。

[3] 谭会生等 . EDA技术及应用[M].西安电子科技大学出版社,2001
[4] 潘松,等.EDA技术实用教程[M].科学出版社,2006
[5] 雷伏容 HDL电路设计[M].清华大学出版社,2006
[6] Charles ,等.数字系统设计与HDL[M].电子工业出版社,2008
)。

相关文档
最新文档