前言
我们已经在第一篇博客中谈到了我们的目标和具体的分工,也在上一篇博客中谈到了基于LSFR的随机数生成方式。接下来的目标是读入部分。
开始
在整个游戏中,读入部分虽然不是很难,也不是很重要,但其准确性还是很重要的。
要求&细节
- 我们希望的输出显示模块需要的是8个四位二进制数作为输入,所以需要让这两个模块进行对齐;
- 在输出显示中我们已经有了一个分频控制数码管使能信号和分段的时钟信号,但是我们在匹配数据还需要一个2HZ的闪烁信号(数码管控制必须要有分频),如果还是放在输出显示模块很明显不合适,所以我们需要在数据模块中直接添加使能信号控制(使能有效输出0,使能无效锁死数码管使能端。)
- 主模块准备写成类似状态机那样,一个一个状态来进行,所以我们需要判断地址的正确性,这里我们在读入地址采用返回四位的地址,最高位为0表示正确,不正确均为1000,这样我们就能控制状态的迁移了。
读入地址
先说一下读入地址吧,这个还是比较好处理的,只要S1的信号给到了我就读入,然后用case语句进行判断,判断8个输出和要传出的地址的内容即可。
功能
读入地址,地址由8为拨码开关显示,如果地址属于0-4则为正确(我们只有五个随机数),其他情况为错误。
地址正确则显示0000000+十进制地址;错误显示8个F
所以我们要输出的8个四进制数,要么是7个0+地址(正确情况),要么是8个1111(也就是0FH)
代码:
`timescale 1ns / 1ps
//读入地址并显示,自调整数码管输入
module in_place(
input s1,
input [7:0]sw,
output reg [3:0]place,//最高位为0代表没问题
output [3:0]num1_o,
output [3:0]num2_o,
output [3:0]num3_o,
output [3:0]num4_o,
output [3:0]num5_o,
output [3:0]num6_o,
output [3:0]num7_o,
output [3:0]num8_o
);
reg [7:0]in ;
reg [3:0]num1 = 4'b1111;
reg [3:0]num2 = 4'b1111;
reg [3:0]num3 = 4'b1111;
reg [3:0]num4 = 4'b1111;
reg [3:0]num5 = 4'b1111;
reg [3:0]num6 = 4'b1111;
reg [3:0]num7 = 4'b1111;
reg [3:0]num8 = 4'b1111;
assign num1_o = num1; //为输出变量赋初值
assign num2_o = num2;
assign num3_o = num3;
assign num4_o = num4;
assign num5_o = num5;
assign num6_o = num6;
assign num7_o = num7;
assign num8_o