lcytms
发表于 2016-11-14 22:40:15
查看RTL视图——顶层模块b2bcd.v
顶层模块b2bcd.v的视图如下所示。
其中最下面为全局视图,上面为左边、右边的局部视图,可以看到17个子步shift移位模块逐次递进的一个结果。
lcytms
发表于 2016-11-14 22:41:08
本帖最后由 lcytms 于 2016-11-14 22:45 编辑
查看RTL视图——shift移位子模块shift.v
shift移位子模块shift.v的RTL视图如下。
lcytms
发表于 2016-11-14 22:42:22
查看RTL视图——preshift移位预操作子模块preshift.v
preshift移位预操作子模块preshift.v的RTL视图如下。
lcytms
发表于 2016-11-14 22:47:22
加入数码管驱动模块seg7.v文件
为了更直观地看到数码管显示效果,在已经做好的工程文件中加入编写好的数码管驱动模块seg7.v文件。
数码管驱动模块seg7.v文件如下所示。
module seg7 (clk, rst_n, data, sel, seg);
input clk, rst_n;
input data;
output reg sel;
output reg seg;
reg count;
reg clk_1ms;
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
clk_1ms <= 1;
end
else
begin
if (count < 24999)
begin
count <= count + 20'd1;
end
else
begin
count <= 0;
clk_1ms <= ~clk_1ms;
end
end
end
reg state;
reg data_temp;
always @ (posedge clk_1ms or negedge rst_n)
begin
if (!rst_n)
begin
sel <= 0;
data_temp <= 0;
state <= 0;
end
else
begin
case (state)
0 : begin
sel <= 0;
data_temp <= data;
state <= 1;
end
1 : begin
sel <= 1;
data_temp <= data;
state <= 2;
end
2 : begin
sel <= 2;
data_temp <= data;
state <= 3;
end
3 : begin
sel <= 3;
data_temp <= data;
state <= 4;
end
4 : begin
sel <= 4;
data_temp <= data;
state <= 5;
end
5 : begin
sel <= 5;
data_temp <= data;
state <= 0;
end
default : state <= 0;
endcase
end
end
always @ (*)
begin
if (!rst_n)
begin
seg = 8'b1111_1111;
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'b1000_1110; //dF
endcase
end
end
endmodule
lcytms
发表于 2016-11-14 22:53:25
新建数据控制模块data_controller.v
新建数据控制模块data_controller.v,循环生成要显示的数字000000~999999,显示数字每100ms更新一次,通过b2bcd模块转换成BCD码,然后输出给数码管驱动模块。
编写代码如下。
module data_controller (clk, rst_n, data);
input clk, rst_n;
output reg data;
reg count;
parameter T100ms = 5_000_000; // 100ms / 20ns = 5_000_000
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
count <= 0;
data <= 0;
end
else
begin
if (count < T100ms - 1)
begin
count <= count + 1;
end
else
begin
count <= 0;
if (data < 999999)
begin
data <= data + 20'd1;
end
else
begin
data <= 0;
end
end
end
end
endmodule
lcytms
发表于 2016-11-14 22:55:24
创建新的顶层模块top.v
创建新的顶层模块top.v,将以上三个模块置入其中进行例化。
修改显示控制参数T100ms,使显示数字每10ms更新一次。
新的顶层模块top.v文件如下所示。
module top (clk, rst_n, sel, seg);
input clk, rst_n;
output sel;
output seg;
wire din;
wire dout;
data_controller #(.T100ms(500_000)) data_controller (.clk(clk), .rst_n(rst_n), .data(din));
b2bcd b2bcd (.din(din), .dout(dout));
seg7 seg7 (.clk(clk), .rst_n(rst_n), .data(dout), .sel(sel), .seg(seg));
endmodule
lcytms
发表于 2016-11-14 22:56:16
参照.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
lcytms
发表于 2016-11-14 22:56:54
.sof文件下载到FPGA
全编译FPGA工程,生成.sof文件,连接至芯ZX-1开发板并上电。
打开Programmer通过Jtag口,将.sof文件下载到FPGA进行在线仿真。
.sof文件下载界面如下图所示。
lcytms
发表于 2016-11-14 22:57:53
开发板运行效果
开发板运行效果如下图所示。
经检查,开发板运行效果与设计相符。
lcytms
发表于 2016-11-14 22:58:16
好了,今天的课程就讲到这里。
通过今天的课程,我们学习了二进制转BCD的基本原理,并对二进制转BCD逻辑电路进行了建模、仿真,结合第四讲的数码管一起编写一个完整的演示逻辑,进行了下板检查。
希望大家掌握二进制转BCD及大四加三算法的基本原理,并熟练运用Verilog语言编写相关逻辑。
更复杂的知识和技巧我们将逐步通过后面的课程展现给大家。
课程到此结束,谢谢大家的关注!