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

作者参加ARM杯赛,使用安路科技EG4S20开发板,基于Cortex-M0内核。初赛后自学Verilog,从复习语法到做流水灯程序,通过TD软件进行硬件编写。代码分析中解释了时钟、复位信号和计数器的工作原理。
摘要由CSDN通过智能技术生成

参加集创赛报名了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

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

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

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

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

这三行语句分别定义了一个常数和两个寄存器,常数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

这个是主循环

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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值