五、实验步骤与实验结果
1、用Verilog VHDL设计D触发器。打开QuarterII新建一个基于ALTERA的Cyclone系列FPGA芯片EP1C3T144C8N的项目保存在D:\dianlu\ecp1文件夹中,新建一个Verilog HDL文件,将附件一代码写入,运行无错误,查看My74161计数器的逻辑图(图1-1),重新运行,无误后,进行“Creat symbol files for current file”操作,将My74161.bsf和My74161.v文件复制到ecp2文件夹中。
图1-1 My74161计数器的逻辑图
对My74161计数器进行仿真。仿真图如图1-2 My74161触发器的仿真图。可知功能表4-1与仿真图一致。
图1-2 My74161计数器的仿真图
2、用My74161计数器组成24进制计数器。再创建一个一个基于ALTERA的Cyclone系列FPGA芯片EP1C3T144C8N的项目保存在D:\dianlu\ecp3文件夹中,通过自己设计的74161计数器进行24进制原理图设计,设计图如图2-1,连接完毕后进行引脚锁定,如图2-2。注意:24进制的进位应该从23开始,23的二进制0001_0111,
图2-1 24进制计数器
图2-2 24进制计数器引脚锁定
3、将24进制计数器进行仿真。仿真图如图3-2,仿真图解读:从0到23一直循环执行下去。
图3-2 仿真图
4、将三位缓冲寄存器下载到FPGA开发板上进行测试,开发板验证结果可以对比仿真图的测试结果,判断逻辑功能是否正确。结果如图4-1,注意:LED灯是是输出为0时才亮
表4-1
脉冲个数 |
输出结果(Q7Q6Q5 Q4Q3Q2 Q1Q0) |
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 … |
0000_0000 0000_0001 0000_0010 0000_0011 0000_0100 0000_0101 0000_0110 0000_0111 0000_1000 0000_1001 0000_1010 0000_1011 0000_1100 0000_1101 0000_1110 0000_1111 0001_0000 0001_0001 0001_0010 0001_0011 0001_0100 0001_0101 0001_0010 0001_0011 0000_0000 … |
5、将输出的结果显示到数码位上而不是单纯的看led的亮与不亮,实现的思路,通过原理图的方式,将输出的Q连接到总线上,然后再连接到我自定义的7段码译码器上。
7段码译码器的实现见附件二,24进制的输出结果用7段码显示见5-1用7段码译码器实现24进制的原理图。
图5-1 用7段码译码器实现24进制的原理图
六、实验讨论与总结
1.准备工作,Quattus创建一个D触发器和一个基本RS触发器,前者为了设计三位缓冲寄存器和四位左移移位寄存器,写verilog代码的时候一定要注意是上升沿触发还是下降沿触发。
2.注意本实验是同步时序电路,千万不要连接成异步的时序电路,同步异步的区别在于clk是不是连接在同一个脉冲上
3.一个74161最大可以构成2^4进制计数器,而两个就可以构成最大2^16进制计数器,所以构造一个24进制计数器用两个74161就可以
4.构成N进制计数器可以通过反馈清零法和同步置数法进行清零,前者不如后者
5.实现了输出结果用7段码的显示
附件一:My74161触发器代码
module My74161(clk, ldn,rdn,ep,et,d3,d2,d1,d0,q3,q2,q1,q0,co);
input clk, ldn,rdn,ep,et,d3,d2,d1,d0;
output q3,q2,q1,q0, co;
reg[3:0] Q;
reg q3,q2,q1,q0,co;
always @(posedge clk or negedge rdn)
begin
if(!rdn)
Q <= 4'b0000;
else
if(!ldn)
begin
Q[3] <= d3;Q[2] <= d2;Q[1] <= d1;Q[0] <= d0;
end
else
if((ep == 1'b1) && (et == 1'b1))
Q <= Q + 4'b0001;
end
always @(Q,et)
begin
co <= Q[3] && Q[2] && Q[1] && Q[0] && et;
q3 <= Q[3];q2 <=Q[2]; q1 <=Q[1];q0 <= Q[0];
end
endmodule
附件二:7段码显示的代码
module my7(clk,RN,Q,seg_out,dig_sel_n);
input clk,RN;
reg clk10ms;
input [4:0]Q;
reg [17:0] cnt2;
//10ms----20MHZ入100HZ输出
//fiv_clock_10ms: 10ms----20MHZ入100HZ输出
always @(posedge clk or negedge RN)
begin
if(!RN)
cnt2 <=0;
else
begin
if(cnt2 == 199_999)
cnt2 <=0;
else
cnt2 <= cnt2 + 1;
if (cnt2 <100_000)
clk10ms <= 1'b1;
else
clk10ms <= 1'b0;
end
end
//zhe shi er xuan yi
reg cnt22;
always @(posedge clk10ms)
begin
if(!RN)
cnt22 <= 0;
else
begin
if(cnt22 == 1)
cnt22 <=0;
else
cnt22 <= cnt22 + 1;
end
end
//zhe shi 7 duan ma shu chu
output reg[7:0] seg_out;
output reg [7:0] dig_sel_n;
function [7:0] seg7;
input [3:0] data;
begin
case(data)
0: seg7= 8'b11000000;
1: seg7= 8'b11111001;
2: seg7= 8'b10100100;
3: seg7= 8'b10110000;
4: seg7= 8'b10011001;
5: seg7= 8'b10010010;
6: seg7= 8'b10000010;
7: seg7= 8'b11111000;
8: seg7= 8'b10000000;
9: seg7= 8'b10010000;
default: seg7= 8'b11111111;
endcase
end
endfunction
always @(cnt22 ,Q,RN)
begin
if(!RN)
begin dig_sel_n <= 8'b11111111; seg_out <=8'b11111111; end
else
case(cnt22)
0: begin dig_sel_n <= 8'b11111110; seg_out <= seg7(Q%10); end
1: begin dig_sel_n <= 8'b11111101; seg_out <= seg7(Q/10);end
default:
begin dig_sel_n <= 8'b11111111; seg_out <= 8'b11111111;end
endcase
end
endmodule