(二)运动码表计时电路Logisim电路原理图和Verilog HDL + DE2-70开发板实现

首先,感谢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开发板的测试情况
在这里插入图片描述在这里插入图片描述
到此结束!!!!

  • 5
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值