lcytms
发表于 2016-11-11 17:05:17
进行分析综合检查。
进行仿真设置。
查看仿真结果。
每次按键按下之后,数据位data和标志位flag都有对应数字的输出。
仿真功能正确。
lcytms
发表于 2016-11-11 17:06:00
本帖最后由 lcytms 于 2017-2-8 20:34 编辑
向工程文件夹添加第四讲的数码管模块seg7.v。
module seg7 (clk, rst_n, data, sel, seg);
input clk, rst_n;
input data;
output reg sel;
output reg seg;
reg clk_1k;
parameter T1ms = 25_000; //half_width
reg count;
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
count <= 0;
clk_1k <= 1;
end
else
begin
if (count < T1ms - 1)
begin
count <= count + 20'b1;
end
else
begin
count <= 0;
clk_1k <= ~clk_1k;
end
end
end
reg state;
reg data_temp;
always @ (posedge clk_1k or negedge rst_n)
begin
if (!rst_n)
begin
sel <= 3'b000;
state <= 0;
end
else
begin
case (state)
0 : begin
sel <= 3'b000;
data_temp <= data;
state <= 1;
end
1 : begin
sel <= 3'b001;
data_temp <= data;
state <= 2;
end
2 : begin
sel <= 3'b010;
data_temp <= data;
state <= 3;
end
3 : begin
sel <= 3'b011;
data_temp <= data;
state <= 4;
end
4 : begin
sel <= 3'b100;
data_temp <= data;
state <= 5;
end
5 : begin
sel <= 3'b101;
data_temp <= data;
state <= 0;
end
default : state <= 0;
endcase
end
end
always @ (*)
begin
if (!rst_n)
begin
seg = 8'b1111_1111; //null
end
else
begin
case (data_temp)
0 : seg = 8'b1100_0000; //d0
1 : seg = 8'b1111_1001; //d1
2 : seg = 8'b1010_0100; //d2
3 : seg = 8'b1011_0000; //d3
4 : seg = 8'b1001_1001; //d4
5 : seg = 8'b1001_0010; //d5
6 : seg = 8'b1000_0010; //d6
7 : seg = 8'b1111_1000; //d7
8 : seg = 8'b1000_0000; //d8
9 : seg = 8'b1001_0000; //d9
10 : seg = 8'b1000_1000; //dA
11 : seg = 8'b1000_0011; //db
12 : seg = 8'b1100_0110; //dC
13 : seg = 8'b1010_0001; //dd
14 : seg = 8'b1000_0110; //dE
15 : seg = 8'b1000_1110; //dF
default : seg = 8'b1111_1111; //null
endcase
end
end
endmodule
lcytms
发表于 2016-11-11 17:09:40
本帖最后由 lcytms 于 2016-11-11 17:12 编辑
新建数码管数据预处理模块pre_seg7.v。
module pre_seg7 (clk, rst_n, data, flag, data6);
input clk, rst_n;
input data;
input flag;
output reg data6;
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
data6 <= 24'h000000;
end
else
begin
if (!flag)
data6 <= data6;
else
data6 <= {data6, data};
end
end
endmodule
lcytms
发表于 2016-11-11 17:13:29
本帖最后由 lcytms 于 2016-11-11 17:15 编辑
新建top.v顶层模块,将以上三个模块都加入到top.v顶层模块中进行例化。
将top.v模块设置为顶层模块。
编写top.v模块如下。
module top (clk, rst_n, col, row, sel, seg);
input clk, rst_n;
input row;
output col;
output sel;
output seg;
wire data;
wire flag;
wire data6;
key_pad k1 (.clk(clk), .rst_n(rst_n), .col(col), .row(row), .data(data), .flag(flag));
pre_seg7 p1 (.clk(clk), .rst_n(rst_n), .data(data), .flag(flag), .data6(data6));
seg7 s1 (.clk(clk), .rst_n(rst_n), .data(data6), .sel(sel), .seg(seg));
endmodule
lcytms
发表于 2016-11-11 17:16:01
本帖最后由 lcytms 于 2016-11-11 17:17 编辑
参照.tcl文件设置好FPGA管脚
参照EP4CE10F17C8Nzx_1.tcl文件内容,对FPGA芯片管脚进行设置。
EP4CE10F17C8Nzx_1.tcl文件相关内容如下所示。FPGA芯片配置结果如图所示。
#set_global_assignment -name FAMILY "Cyclone IV"
#set_global_assignment -name DEVICE ep4ce10f17c8n
set_location_assignment PIN_E1 -to clk
# KEY 轻触按键
set_location_assignment PIN_L3 -to key
# SEG7 x 8 七段数码管
set_location_assignment PIN_L6 -to sel
set_location_assignment PIN_N6 -to sel
set_location_assignment PIN_M7 -to sel
set_location_assignment PIN_T11 -to seg
set_location_assignment PIN_T10 -to seg
set_location_assignment PIN_T9 -to seg
set_location_assignment PIN_T8 -to seg
set_location_assignment PIN_T7 -to seg
set_location_assignment PIN_T6 -to seg
set_location_assignment PIN_T5 -to seg
set_location_assignment PIN_T4 -to seg
# KEY_BORD
set_location_assignment PIN_L15 -to col
set_location_assignment PIN_N15 -to col
set_location_assignment PIN_P15 -to col
set_location_assignment PIN_T15 -to col
set_location_assignment PIN_R14 -to row
set_location_assignment PIN_R16 -to row
set_location_assignment PIN_P16 -to row
set_location_assignment PIN_N16 -to row
lcytms
发表于 2016-11-11 17:18:44
.sof文件下载到FPGA
全编译FPGA工程,生成.sof文件,连接至芯ZX-1开发板并上电。
打开Programmer通过Jtag口,将.sof文件下载到FPGA进行在线仿真。
.sof文件下载界面如下图所示。
lcytms
发表于 2016-11-11 17:19:41
本帖最后由 lcytms 于 2016-11-11 17:21 编辑
开发板运行效果
开发板运行效果如下图所示。
经检查,开发板运行效果与设计相符。
程序下载后,当键盘矩阵按下1位按键时,该数补充到显示的6位数的低位上,高位左移。
比如,数码管原来显示012345,如果键盘按下6,则数码管显示变为123456。
lcytms
发表于 2016-11-11 17:20:44
本帖最后由 lcytms 于 2016-11-11 17:21 编辑
好了,今天的课程就讲到这里。
通过今天的课程,我们学习了键盘矩阵的基本原理,并对键盘矩阵逻辑电路进行了建模、仿真,结合第四讲的数码管一起编写一个完整的演示逻辑,进行了下板检查。
希望大家掌握键盘矩阵的基本原理,并熟练运用Verilog语言编写驱动逻辑。
更复杂的知识和技巧我们将逐步通过后面的课程展现给大家。
课程到此结束,谢谢大家的关注!
Sunlife
发表于 2016-11-16 16:21:30
感谢楼主分享
芙蓉王
发表于 2016-11-17 16:51:23
感谢楼主