参加集创赛报名了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
这个是主循环文章来源:https://www.toymoban.com/news/detail-853000.html
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
上面是例化模块文章来源地址https://www.toymoban.com/news/detail-853000.html
到了这里,关于安路EG4S20 FPGA开发板学习记录1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!