前言
- 之前的文章《如何学习verilog,如何快速入门?》中提到了verilog学习,只想传输一个观点:刚开始学习的时候,建议直接通过视频学习,当您有收获时,再去查阅书籍,把它们当成工具书。
- 这篇文章就通过上一篇文章中提到的方法,演示一下!
- 本文基于【开源骚客】FPGA超详细入门视频教程学习所得,简单做个笔记!
00. FPGA开发软件的安装
在高校,verilog的教学大都是基于FPGA学习的,所以学习资源很丰富,我们就可以从这个方向入手!而FPGA学习需要一个软件,下面这就请您去安装软件,前面提到的视频教程就有详细的指导!
- Quartus II 13.1
- Modelsim
- Notepad++
- Vim
01. 我的第一个FPGA工程:点亮led
(1) 一个很简单的verilog设计代码:led.v
在这里,希望初学者,不要有任何质疑:不要纠结东西怎么来的,为什么是这样!因为你在学1+1=2,它不需要你去推敲!
//led.v
module led(
output wire led0 ,//ctrl+D快速复制当前行
output wire led1 ,
output wire led2 ,
output wire led3
);
// EP4CE6E22CBN 是FPGA开发板上的型号。
assign led0 = 0;
assign led1 = 0;
assign led2 = 0;
assign led3 = 0;
endmodule
(2) Verilog HDL语法
- 上面这个就是一个很基本的verilog设计代码,下面就简单给读者指出:模块名、端口列表、端口声明等,还有按位操作符之类的基本常识!
- 在这里,一个基本的verilog设计代码就是上面这样的框架,看完视频的您,是不是豁然开朗!
02.板级验证:下载到板子上
- 这个环节,是什么意思呢?
- 简单地讲,前面设计的这个代码led.v的功能是点亮一个led灯,放在板子上就是为了验证这个功能!
- 这就是验证的时候用JTAG调试接口的部分过程
- **那要不要买个板子试试呢?**小编觉得都行,其实小编是在咸鱼上买了一个很便宜的,做完了所有的实验,实操的感觉真舒服!
分配管脚pin planner
初次下载代码到FPGA时,需要给下载器安装驱动,Altera USB-Blaster。
驱动目录选择Quartus安装目录下的drivers即可。
03.FPGA验证:test.v
- 这么说哈,对于ASIC,以前没有IC数字验证,就是用这种方式验证的‘’
- 随着设计复杂度的提高,
- 这种方式逐渐被sv、uvm等验证方法学所替代,
- 晓得了吧。
- 所以说,学IC验证,学verilog是很有必要的,要体验这个过程!
module test(
input port_a , //只有wire,没有reg型
input port_b , //只有wire,没有reg型
input port_c , //只有wire,没有reg型
output wire port_d , //默认为wire
output wire port_e ,
output wire port_f ,
output wire port_g ,
output wire port_h
);
//assign: 对wire型进行赋值
//always:对reg 型进行赋值
assign port_d = port_a & port_b;
assign port_e = port_a | port_c;
assign port_f = ~port_a;
assign port_g = port_b ^ port_c;
assign port_h = port_a ^~ port_c;
endmodule
04. Modelsim 进行仿真(小编在这里用的questasim)
tb_test.v
- 其实,这里可以和前面的test合并成一个文件,在后面学习完小梅哥的视频,你就会有一个深刻的认识!
`timescale 1ns/1ns // 时间单位 / 时间精度
module tb_test;
reg test_a;
reg test_b;
reg test_c;
wire rslt_d;
wire rslt_e;
wire rslt_f;
wire rslt_g;
wire rslt_h;
// initial 赋值的信号,必须定义成reg型
initial begin
test_a = 1; // 在0时刻赋初值
test_b = 1;
test_c = 1;
#5
test_a = 0; // 在5时刻赋初值
test_b = 1;
test_c = 1;
#5
test_a = 0; // 在10时刻赋初值
test_b = 0;
test_c = 0;
end
test test_inst(
.port_a (test_a ), //只有wire,没有reg型
.port_b (test_b ), //只有wire,没有reg型
.port_c (test_c ), //只有wire,没有reg型
.port_d (rslt_d ), //默认为wire
.port_e (rslt_e ),
.port_f (rslt_f ),
.port_g (rslt_g ),
.port_h (rslt_h )
);
endmodule
wave
后记
- 查看往期文章,请点击跳转
《IC前端数字验证导学》
《如何学习verilog,如何快速入门?》 - 如需长期追更,可以扫码关注下面这个公众号