赞
踩
参加集创赛报名了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
上面是例化模块
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。