数字逻辑大作业
开发环境:
- Nexys4板
- EDA: vivado 2016.2
基本游戏逻辑全部完成:
- 可以显示背景和两架坦克,两架坦克可以同时自由移动,不能穿墙
- 可以发射炮弹,炮弹不能穿墙
- 炮弹击中后会触发爆炸,然后游戏结束
2017年不打算继续更新。如果还有时间,会考虑增加音乐效果。
演示图片:
VGA显示略有偏移(原来是ROM的延迟……) (12.26)键盘控制坦克移动有点迷啊……(12.25)- 靠近墙壁操作容易“飞出”屏幕……
- 可以发射炮弹(已完成)
- 炮弹击中坦克后会爆炸(已完成)
- 爆炸需要有视觉和听觉效果
- 游戏结束的画面
......
- 所有信号名字一律小写+下划线
- 使用有意义的名字和规范的缩写
- 低电平有效的信号一律加上_n,比如rst_n
- 常量名一律大写,比如parameter CLK_PERIOD = 20;
- 避免使用数字或者reg作为后缀
- 同一信号在不同层次或者模块应该保证命名的一致性
- 总线命名必须从高位到低位,只允许[N:0] 不允许[0:N]
- 模块名一律首字母大写,包括IP名,并且与文件名一致
- 实例化的名字格式:U_Xxxx_0
- 采用Verilog2001规范,即IO接口一律写在括号内,并且标明类型(wire/reg),并且独占一行
- 顶层模块只允许实例化和声明信号,不允许任何assign 或者 always,不能出现任何胶合逻辑
- 每一个文件只允许有一个模块,该模块的测试文件
- 每一个模块应在开始处标明文件名,功能描述,引用的模块等信息
- 一个reg变量只允许在一个always内赋值
- 同一个信号赋值不允许同时使用阻塞和非阻塞方式
- 变量的赋值要注明数字的宽度和进位制
- 用括号表示运算优先级
- 一行只允许出现一个表达式
- 不允许给信号赋值x态
- 包含时序逻辑的电路必须用非阻塞赋值
- 纯组合逻辑电路必须使用阻塞赋值
- 复位信号一定要是异步的
- 每一个if必须有一个else语句,没有else的语句可能会多出锁存器(条件的完整性)
- 每一个case必须有一个default语句,default允许空语句(条件的完整性)
- 禁止使用casex,casez
- case语句的item必须使用常数(最好在parameter定义过的)
- 有限状态机的状态必须由parameter分配
- 有限状态机可以尝试使用“三段式”写法:两个always模块产生当前状态和输出,再用一个组合always产生下一个状态
e.g.
//当前状态
always @(posedge clk, negedge rst_n)
begin
if(!rst_n)
state <= STATIC;
else
state <= next_state;
end
//下一个状态
always @(state)
begin
case (state)
STATIC: next_state = xxxx;
MOVE : next_state = xxxx;
.....
endcase
/*
建议用if-else实现,因为还有一些转移条件需要考虑
*/
end
//输出
always @(posedge clk, negedge rst_n)
begin
if(!rst_n)
out <= xxxx;
else<
out <= xxxx;
end