当前位置:   article > 正文

安路EG4S20 FPGA开发板学习记录1

eg4s20

参加集创赛报名了arm的杯赛,用的是安路科技的EG4S20开发板,基于cortex-M0内核。初赛时什么也不会,研究生的方向是做二维材料,但是想着以后找工作往ic方向靠拢,只能硬着头皮自学。没想到初赛随便交了东西上去竟然进了复赛,本来准备放弃的,现在重新开始一点点学习。
没办法,就从最基础的开始,首先复习了一下Verilog的基本语法,刷了一些HDLbits的题目,然后就跟着硬木课堂的教程开始一点点学。
首先是最简单的流水灯程序,使用安路科技的TD软件进行硬件编写。不过这个编辑器确实不好用,最开始写Verilog代码用的是vs code。
最简单的代码考验基本能力。首先要做流水灯,必须知道会用到哪些东西,基本的LED肯定要有,然后就是时钟信号、复位信号等。开发板上的时钟信号由50MHz的晶振产生,复位信号就是按键sw0。
首先编写基本电路代码

module led8_run(
    input CLK,
    input RESTn,
    output [7:0]LED_Out
);

parameter t100ms = 23'd5000000;  //设置常数用以控制流水灯转换速度
reg [22:0]count;  //用于计数
reg [7:0]rLED_Out;  //用于存储LED输出信号

always@(posedge CLK or negedge RESTn)
    begin
        if(!RESTn)
            begin
                count <= 23'd0;
                rLED_Out <= 8'b0000_0001;
            end
        else if (count == t100ms - 1'b1) 
            begin
                count <= 23'd0;
                if(rLED_Out == 8'b0000_0000)
                    rLED_Out <= 8'b0000_0001;
                else
                    rLED_Out <= {rLED_Out[0],rLED_Out[7:1]};
            end
        else
            count <= count + 1'b1;
    end

    assign LED_Out = rLED_Out;

endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

这个代码就是硬木课堂官网开源的代码。我自己学习的时候从上到下分析了一下,在此记录一下分析过程便于以后学习。

module led8_run(
    input CLK,
    input RESTn,
    output [7:0]LED_Out
);
  • 1
  • 2
  • 3
  • 4
  • 5

上面这一块不必多说,就是Verilog的模块的开始,定义了输入和输出。

parameter t100ms = 23'd50000000;
reg [22:0]count;  //用于计数
reg [7:0]rLED_Out;  //用于存储LED输出信号
  • 1
  • 2
  • 3

这三行语句分别定义了一个常数和两个寄存器,常数t100ms设置为23位长的十进制5000_000,因为板子的时钟是50MHz,这个t100ms用来制造一个100ms的时间间隔,0.1秒亮一个灯。(因为50MHz即一秒分为50000000份,现在取5000000为一份即可分为10份,就是0.1s)。寄存器count和rled_out用来计数和存led的输出信号。

always@(posedge CLK or negedge RESTn)
    begin
        if(!RESTn)
            begin
                count <= 23'd0;
                rLED_Out <= 8'b0000_0001;
            end
        else if (count == t100ms - 1'b1) 
            begin
                count <= 23'd0;
                if(rLED_Out == 8'b0000_0000)
                    rLED_Out <= 8'b0000_0001;
                else
                    rLED_Out <= {rLED_Out[0],rLED_Out[7:1]};
            end
        else
            count <= count + 1'b1;
    end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

这个是主循环

module top_test1(
    CLK,RESTn,LED_Out
);

    input CLK;
    input RESTn;
    output [7:0]LED_Out;

    led8_run ri(
        .CLK(CLK),
        .RESTn(RESTn),
        .LED_Out(LED_Out)
    );

endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

上面是例化模块

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/474747
推荐阅读
相关标签
  

闽ICP备14008679号