实验(二)基于BASYS3平台的FPGA流水灯实验

这篇具有很好参考价值的文章主要介绍了实验(二)基于BASYS3平台的FPGA流水灯实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

枯藤老树昏鸦,小桥流水人家。                                   — — — —《天净沙.秋思》马致远

文章目录  

  • 前言
  • 一、实验内容
  • 二、实验平台
  • 三、设计思路与方案
  • 四、RTL代码设计
  • 五、仿真测试程序设计
  • 六、电路与仿真结果
  • 七、管脚规划
  • 八、板子上电演示
  • 总结

前言

大四毕业后白嫖了电子创新实验室的一块FPGA,这块板子适合做数电实验,为了物尽其用,趁这个暑假搭配特权同学做的《深入浅出玩转FPGA》视频学习入门一下,用它整点活。

一、实验内容

让板载的8颗LED灯每隔1秒依次点亮,全亮后又每隔1秒依次熄灭,循环。

二、实验平台

RTL代码编写平台:Vivado 2019.1

FPGA开发板:Xilinx  BASYS3

芯片型号:Artix家族  xc7a35tcpg236-1

三、设计思路与方案

1.总体构想

如下图所示,我的构想由计时模块和类38线译码器模块组合而成,时钟和复位信号输入,8颗LED灯作为输出,计时模块处理LED灯亮灭的时序逻辑,产生1Hz方波进行计数,由于计数值为0~7共8位,所以联想到38译码器,这样可以通过3位二进制数作为地址输出给后级模块去控制8颗LED灯(模拟成8位二进制数),LED状态的刷新受到计时模块时钟的控制。

fpga产生1hz方波,fpga开发

2.计时模块设计

查看BASYS3开发板的原理图可知,系统时钟由DSC1033CC1-100.0000T晶振产生,为100Mhz,如下图所示。

fpga产生1hz方波,fpga开发

为了达到“每隔1秒亮一次”,需要利用系统时钟产生1Hz 的方波(周期为1s),通过对系统时钟上升沿的计数可以实现,由于(100MHz/100 000 000=1Hz),所以当从0计到99 999 999时就得到1Hz的频率,并且在一周期内对半周期前后的电平翻转就可以得到1Hz、占空比50%的延时时钟。

在产生了延时时钟后,需要再对这个时钟的下降沿进行计数,如下图所示,从0计数到7,每一个计数值对应了一个3位的地址,依次对应着8颗LED灯的一种亮灭状态;计数过了7后清零,并且翻转片选信号,片选信号为0时运行的是“8颗LED灯每隔1秒依次点亮”的过程,为1时运行的是“每隔1秒依次熄灭”的过程。

fpga产生1hz方波,fpga开发

3.类3-8译码器的设计

模块的真值表如下图所示,地址和片选共同作用使8位LED值输出对应的电平信号,高电平点亮LED,低电平熄灭LED。

fpga产生1hz方波,fpga开发

 文章来源地址https://www.toymoban.com/news/detail-769199.html

四、RTL代码设计

1.计时模块leds程序

module leds(
 input clk,                               //100Mhz系统时钟
 input rst,                               //复位信号,高电平有效
 output reg [2:0] ctrl_data,              //控制数据,输出到后级译码器中
 output  led_clk,                         //1Hz时钟
 output  led_cs                           //片选信号,输出到后级译码器用于选择状态
    );
 reg[27:0] cnt;                           //计数值,用于产生1Hz信号
 parameter cnt_max = 28'd99_999_999;     //计数最大值
 parameter cnt_half = 28'd49_999_999;    //计数中值
 reg led_clk_r;                          //1Hz方波时钟
 reg led_cs_r;                           //片选信号
 
 /****产生1Hz的方波****/
always @ (posedge clk or posedge rst)
 begin
    if(rst) cnt <= 28'd0;
    else if(cnt < cnt_max) cnt <= cnt+1'b1;
    else cnt <= 28'd0;
 end
 
always @ (posedge clk or posedge rst)
begin
    if(rst) led_clk_r <= 1'b0;
    else if(cnt < cnt_half) led_clk_r <= 1'b0;
    else led_clk_r <= 1'b1;
end

assign led_clk = led_clk_r;

/****在1Hz方波时钟信号下计数****/
always @ (negedge led_clk or posedge rst)
begin
    if(rst) 
    begin
        ctrl_data <= 3'd0;
        led_cs_r <= 1'b0;
    end
    else if(ctrl_data < 3'd7) ctrl_data <= ctrl_data+1'b1;
    else 
     begin 
        ctrl_data <= 3'd0;
        led_cs_r <= ~led_cs_r;
     end
end

assign led_cs = led_cs_r;

endmodule

2.译码模块code程序

module code(
    input clk,                      //100Mhz系统时钟
    input rst,                      //复位信号,高电平有效
    output reg [7:0] leds_out       //输出8个LED信号
    );
    
    wire [2:0] ctrl;                //前级输入的控制地址
    wire cs;                        //前级输入的片选信号

/****leds模块例化语句****/
    leds myleds(
        .clk(clk),
        .rst(rst),
        .ctrl_data(ctrl),
        .led_cs(cs)
    );
    
/****类3-8线译码器的设计****/
    always @ (ctrl or cs or rst)
     begin
     if(rst)  leds_out = 8'b0000_0000;
     else
      begin
        if(!cs)
        begin
             case(ctrl)
            3'b000: leds_out = 8'b0000_0001;
            3'b001: leds_out = 8'b0000_0011;
            3'b010: leds_out = 8'b0000_0111;
            3'b011: leds_out = 8'b0000_1111;
            3'b100: leds_out = 8'b0001_1111;
            3'b101: leds_out = 8'b0011_1111;
            3'b110: leds_out = 8'b0111_1111;
            3'b111: leds_out = 8'b1111_1111;
            endcase
        end
        else
        begin
            case(ctrl)
            3'b000: leds_out = 8'b1111_1110;
            3'b001: leds_out = 8'b1111_1100;
            3'b010: leds_out = 8'b1111_1000;
            3'b011: leds_out = 8'b1111_0000;
            3'b100: leds_out = 8'b1110_0000;
            3'b101: leds_out = 8'b1100_0000;
            3'b110: leds_out = 8'b1000_0000;
            3'b111: leds_out = 8'b0000_0000;
            endcase
        end
      end
        
     end
    
endmodule

五、仿真测试程序设计

注意,板子上的按钮为摁下接到高电平,松开接到低电平,原理图如下所示,这里我们用到的是5个中的1个,在后续小节会讲到如何分配管脚,所以在设计仿真测试程序时要让rst信号由低电平跳上高电平然后过一点点时间再拉低。

fpga产生1hz方波,fpga开发

 1.leds计时模块仿真测试程序

module leds_sim;
 reg clk;
 reg rst;
 wire [2:0] ctrl_data;
 wire led_clk;
 wire led_cs;
 
 leds text_leds(
    .clk(clk),
    .rst(rst),
    .ctrl_data(ctrl_data),
    .led_clk(led_clk),
    .led_cs(led_cs)
 );
 
 initial begin
    clk = 0;
    rst = 0;
    #1000 rst = 1;
    #1000 rst = 0;
  end
  
  always #5 clk = ~clk;  //输出100Mhz方波信号,每隔5ns翻转一次电平
 
endmodule

2.计时&译码仿真测试程序

module cod_sim;
    reg clk;
    reg rst;
    wire [7:0] leds_out;
    
    code text_code(
        .clk(clk),
        .rst(rst),
        .leds_out(leds_out)
    );
    
 initial begin
    clk = 0;
    rst = 0;
    #1000 rst = 1;
    #1000 rst = 0;
  end
  
  always #5 clk = ~clk;
endmodule

六、电路与仿真结果

下图为leds计时模块的行为仿真结果。

fpga产生1hz方波,fpga开发

下图为leds&code总模块的仿真结果。

fpga产生1hz方波,fpga开发

下图为综合后总模块的RTL原理图。

fpga产生1hz方波,fpga开发

 

七、管脚规划

由下图所示,100Mhz系统时钟输入到了W5引脚中,所以我们给clk引脚配置为W5。

fpga产生1hz方波,fpga开发

 

rst复位引脚我们配置为T17,原理图如下图所示。

fpga产生1hz方波,fpga开发

 8颗LED灯管脚号如下图所示,从右往左位数依次升高。

fpga产生1hz方波,fpga开发

 总的管脚配置文件如下所示。

set_property PACKAGE_PIN T17 [get_ports rst]
set_property PACKAGE_PIN U16 [get_ports {leds_out[0]}]
set_property PACKAGE_PIN E19 [get_ports {leds_out[1]}]
set_property PACKAGE_PIN U19 [get_ports {leds_out[2]}]
set_property PACKAGE_PIN V19 [get_ports {leds_out[3]}]
set_property PACKAGE_PIN W18 [get_ports {leds_out[4]}]
set_property PACKAGE_PIN U15 [get_ports {leds_out[5]}]
set_property PACKAGE_PIN U14 [get_ports {leds_out[6]}]
set_property PACKAGE_PIN V14 [get_ports {leds_out[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {leds_out[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {leds_out[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {leds_out[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {leds_out[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {leds_out[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {leds_out[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {leds_out[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {leds_out[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports rst]

set_property PACKAGE_PIN W5 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]

八、板子上电演示

仿真、综合、布局布线、分配管脚后,可以生成bit文件,通过USB线给开发板上电,vivado连上器件xc7a35tcpg236-1后将bit文件烧录至开发板。

fpga产生1hz方波,fpga开发

实验运行视频如下所示。

QQ视频20230709170724

总结

fpga产生1hz方波,fpga开发

 

到了这里,关于实验(二)基于BASYS3平台的FPGA流水灯实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 5.2 FPGA:基于verilog的LED流水灯设计(多种方法)

    目录 设计目标:8个LED灯以每0.5s的速率进行循环闪烁 方法1:移位法实现 设计模块 仿真代码 实验结果  方法2:循环移位方法  设计模块 方法3:使用三八译码器实现流水灯 顶层模块 底层模块 当仿真时时间长,可以减小设计代码的计数次数,对分析移位功能没有影响。 设计

    2024年02月06日
    浏览(45)
  • fpga--流水灯

    fpga流水灯的设计 思路:外部时钟频率50mhz,若要实现每隔0.5s闪烁一次,则使用内部计数器计数到24999999拉高一个周期电平,当电平被拉高的时候,进行LED灯电平的设置,每次检测到高电平,就进行一位LED灯的设置,进行循环设置,就形成了流水灯的设计。 测试代码  

    2024年02月15日
    浏览(42)
  • 流水灯——FPGA

    环境: 1、Quartus18.0 2、vscode 3、板子型号:EP4CE6F17C8 要求: 每隔0.2s循环亮起LED灯 从LED0开始亮起到LED3又回到LED0循环往复。 流水灯 这里使用了拼接符对LED进行处理加上一个0.2s的计时器进行控制即可。 led流水灯

    2024年02月16日
    浏览(48)
  • FPGA学习——点亮流水灯

    在FPGA开发板中,一般板载LED默认高电平点亮,因此我们只需要将想要亮起的LED赋值为1即可。 本入门实验要求为每隔1s开发板上的LED轮流亮起,因此我们需要一个1s的计数器, 由于开发板晶振时钟为50MHz,因此我们计数50_000_000即为1s。 注意:为了后续方便仿真所以这里MAX设置

    2024年02月13日
    浏览(48)
  • 实验 6 流水灯设计

    6.1 实验目的 编 写 Verilog HDL 代 码 驱 动 开 发 板 上 10 颗 LED 实现流水灯效果 6.2 实 验 仪 器 与 器 材 1. EDA 开发软件 一 套 2.微机 一 台 3.实验开发系统 一 台 4.打印机 一 台 5.其他器件与材料 若 干 6.3 实 验 说 明 1、 10 位的流水灯,从左到右流水,每隔 500ms 流动一下

    2024年01月16日
    浏览(41)
  • ARM实验5-流水灯仿真实验

    一、实验名称:流水灯仿真实验 二、实验目的: 掌握ARM处理器的输入输出接口。 掌握通过MDK提供的仿真功能,实现系统的仿真运行。 通过该编程实验,进一步巩固和强化学生ARM汇编编程的能,ARM应用程序框架,培养学生实际应用的能力。 三、实验内容: 按下面电路图,编

    2024年02月15日
    浏览(40)
  • 按键控制流水灯方向——FPGA

    环境: 1、Quartus18.0 2、vscode 3、板子型号:EP4CE6F17C8 要求: 按键1按下,流水灯从右开始向左开始流动,按键2按下,流水灯从左开始向右开始流动,按键3按下LED每隔1s进行亮灭,按键4按下LED常亮。 “自锁”是指开关能通过锁定机构保持某种状态(通或断),“轻触”是说明操

    2024年02月07日
    浏览(47)
  • SOC FPGA之流水灯设计

            Altera Soc EDS开发套件的核心是Altera版ARM Development Studio 5(DS-5)工具包,为SoC器件提供了完整的嵌入式开发环境、FPGA自适应调试和对Altera工具的兼容。 首先下载破解器 然后进入cmd运行,进入到破解器所在文件夹  然后输入patcher.exe --license ?:licensepath 最后显示.dat文件即

    2024年02月14日
    浏览(43)
  • FPGA学习——verilog实现流水灯

    学习芯片: EP4CE6F17C8 verilog代码如下: 配置引脚,查看芯片的指导书: 烧录运行结果如下: 如图我们可以看见开发板上四个led灯同时被电亮。 代码如下: 配置引脚,查看clock和key的引脚: 运行结果如下图: 此时可以看见四个led灯同时闪烁。 流水灯代码实现: 实验效果图如

    2024年02月16日
    浏览(56)
  • FPGA:Vivado流水灯设计详细流程(1)

    基于Vivado的FPGA设计开发的流程主要包括以下步骤: 1)创建工程; 2)创建源设计文件,包括Verilog文本、IP核、模块文件、网表输入等方式; 3)行为仿真(Behavioral Simulation),Vivado自带仿真器,也可以选择第三方仿真软件ModelSim等工具进行仿真; 4)综合(Synthesis):根据设

    2024年02月03日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包