首先,感谢MOOC华中科技大学谭志虎老师的计算机硬件设计课程!这套课程学习下来,帮助我理解了当时学习数字逻辑课程中存在的许多困惑!!
硬件菜鸡一枚,本人硬件课程设计遇到的,特此记录下来,作为自己的学习记录,同时希望给还在挠头的同学一点参考,起到抛砖引玉的效果。废话少说!!正文来了!!!!
第一步:先在logisim中绘制电路原理图,
运动码表的计时电路输出为16位的二进制数据,因此需要4个4位的BCD码计数器,从高到低,依次来表示分的十位、分的个位、秒的十位、秒的个位、其中,秒的十位为0到5的计数器,其他均为0到9的计数器
注意:低位的进位信号又是高位的时钟驱动信号。
下面解释4位BCD码计数器该怎么做,展示0到9的BCD码计数器的做法,0到5的同理可得。
4位的BCD码计数器的电路如上图所示,由状态转换电路 + 输出函数电路两部分构成,状态转换电路控制0到9各个状态的切换,后面连接的4个D触发器可以将当前状态保存一个上升沿时间周期。当从9到0转换时,代表上一个循环过程结束。此时输出函数输出进位信号为1。BCD码计数器又开始从0到9计数。
状态转换电路的真值表:
在logisim中可以根据状态转换电路的真值表生成状态转换电路
输出函数电路:当从9到0时,输出函数输出1
输出函数的真值表
用真值表生成的电路原理图:
将做好运动码表计时电路进行封装。
第二步:在logisim中用数码管来测试运动码表计时电路的正确性
经过测试当计时为0059时下一个数位0100(1分钟)可以完成跳转,电路设计正确。
第三步:使用Verilog HDL语言来描述运动码表的计时电路
module bcd_counter1(en_10,clk_10,res_10,zin_10,zout_10,qout_10);//一位的十进制计数器
input en_10,clk_10,res_10;
input zin_10; //低位向本位的进位
output zout_10; //本位向高位的进位信号
output reg[3:0]qout_10;//本位的显示结果
always@(posedge clk_10)//clk 和 res均为上升沿有效,即高电平有效
if(res_10)
qout_10 <= 4'b0;
else
if(en_10)
if (qout_10==4'h9)
qout_10 <= 4'b0;
else
if(zin_10)
qout_10 <= qout_10 + 1'b1;
assign zout_10 = (qout_10 == 4'h9); //思考什么时候进位
endmodule //到这里1位的十进制计数器
module bcd_counter2(en_6,clk_6,res_6,zout_6,qout_6,zin_6);//1位的6进制计数器,用于秒的十位
input en_6,clk_6,res_6;
input zin_6;
output zout_6;
output reg[3:0]qout_6;
always@(posedge clk_6) //clk 和 res均为上升沿有效,即高电平有效
if(res_6)
qout_6 <= 4'b0;
else
if(en_6)
if(qout_6==4'h6)
qout_6 <= 4'b0;
else
if(zin_6)
qout_6 <= qout_6 + 1'b1;
assign zout_6 = (qout_6 == 4'h6);// 思考,什么时候进位
endmodule //到这里1位的6进制计数器,用于秒的十位
module jishiqi(en,clk,res,D_count_16);//调用1位的十进制计数器和1位的6进制计数器,形成4位的计数器作为码表的分(十位),分(个位),秒(十位),秒(个位)
input en,clk,res;
output[15:0] D_count_16;
wire mone_mten_out,//秒的个位到十位的进位
mten_fone_out,//秒的十位到分的个位的进位
fone_ften_out;//分的个位到分的十位的进位
bcd_counter1 mone(
.en_10(en),
.clk_10(clk),
.res_10(res),
.zin_10(1'b1),
.zout_10(mone_mten_out),
.qout_10(D_count_16[3:0])
);
bcd_counter2 mten(
.en_6(en),
.clk_6(clk),
.res_6(res),
.zout_6(mten_fone_out),
.qout_6(D_count_16[7:4]),
.zin_6(mone_mten_out)
);
bcd_counter1 fone(
.en_10(en),
.clk_10(clk),
.res_10(res),
.zin_10(mten_fone_out),
.zout_10(fone_ften_out),
.qout_10(D_count_16[11:8])
);
bcd_counter1 ften(
.en_10(en),
.clk_10(clk),
.res_10(res),
.zin_10(fone_ften_out),
.zout_10(),
.qout_10(D_count_16[15:12])
);
endmodule
代码有点冗余,但逻辑对着,希望大佬批评指正。(哈哈哈)
第四步:将运动码表计时电路的Verilog HDL下载到DE2-70开发板上
运动码表计时电路的电路原路图如图所示,
通过运动码表的计时电路和数码管驱动电路相连,可以进行显示了。
引脚分配情况:
SW0 为使能信号
SW1为复位信号
KEY0为时钟脉冲信号
下载到DE2-70开发板的测试情况
到此结束!!!!