我的大学之计算机组成原理系列NO.2

课题:输入输出
一、实验思路
1.熟悉VerilogHDL语言的编程和调试方法
2. 熟悉 ISE Design Suite 14.7 软件平台的基本操作,使用该平台进行逻
辑部件的输入、编辑和调试
3. 集合Sptran-3开发板进行布线,对开发板进行编程与操作
4. 掌握Sptran-3开发板的基本I/O应用

二、实验设备
1.ISE Design Suite 14.7
2.EDK-3 SA ISE实验平台

三、实验任务

  1. 通过8个拨盘开关按每个4位二进制数设置两个数,LED实时显示开关的设置,通过按键将设置的数输入,并在数码管的后两位以十六进制方式显示。
  2. 时钟信号使用实验板上50MHz时钟(Clk),四个开关的设置从左至右依次为:输入Enter、左移Left、右移Right、复位Rst,其它变量为时钟Clk、二极管显示Led(8位)、七段码显示器位选(Node)、七段码显示器段选(Seg)。
  3. 七段数码管的显示加小数点共8位,由8位变量Switch控制,同时控制LED亮暗。4位数字由4位Node控制显示。Node每位对应一位数字,为0时,数码按Switch设置显示数字。显示时系统快速扫描显示4位数字,利用人的视觉残留显示清晰的数字。由于时钟相对于数码管显示频率过高,显示时需要适当的分频。

四、主要代码

module Inout(
input Clk,
    input Enter,
    input Left,
    input Right,
    input Rst,
    input [7:0] Switch,
    output reg [7:0] Led,
    output [3:0] Node,
    output [7:0] Seg
    );
	   reg[15:0] Digit;
	 reg[31:0] Count;//Counter
	 
	 
	 always@(posedge Clk)
	 begin
	   Led<=Switch;//二极管显示对应开关的设置
		if(Enter==0)
		  Digit[7:0]<=Switch;//将开关值输入到寄存器低八位
		if(Left==0)
		  if(Count[16:0]==0)   //适当分频
		    Digit<=({Digit[11:0],Digit[15:12]}|0);//左移
	   if(Right==0)//适当分频
		  if(Count[16:0]==0)
		    Digit<=({Digit[3:0],Digit[15:4]}|0);//右移
		if(Rst==0)
		  Digit<={16'h1234};//重置,初值为1234	
	 end
	 always@(negedge Clk)
	 begin
	   if(Rst==0)
    		Count<=0;//重置,计数器初始值为0
		else
		   Count<=Count+1;		
	 end
	 Display Inst1(Clk,Rst,Count,Digit,Node,Seg);
endmodule
module Display(
   input Clk,
	input Rst,
	input[31:0] Count,
	input[15:0] Digit,
	output reg [3:0] Node,
	output reg [7:0]  Seg);
	reg[3:0] Code;	
	always@(posedge Clk)
	begin
	  case(Count[15:14])
	    2'b00://第一个位
		    begin
			   Node<=4'b1110;
				Code<=Digit[3:0];
			 end
		 2'b01:
		    begin
			 	Node<=4'b1101;//第二个位
				Code<=Digit[7:4];
			 end		 
		 2'b10:
		    begin
			 	Node<=4'b1011;//第三个位
				Code<=Digit[11:8];
			 end
		2'b11:
		    begin
			 	Node<=4'b0111;//第四个位
				Code<=Digit[15:12];
			 end 
	  endcase
	  case(Code)
	      4'b0000 : Seg <= 8'b11000000;		// 0
			4'b0001 : Seg <= 8'b11111001;		// 1
			4'b0010 : Seg <= 8'b10100100;		// 2
			4'b0011 : Seg <= 8'b10110000;		// 3
			4'b0100 : Seg <= 8'b10011001;		// 4
			4'b0101 : Seg <= 8'b10010010;		// 5
			4'b0110 : Seg <= 8'b10000010;		// 6
			4'b0111 : Seg <= 8'b11111000;		// 7
			4'b1000 : Seg <= 8'b10000000;		// 8
			4'b1001 : Seg <= 8'b10010000;		// 9
			4'b1010 : Seg <= 8'b10001000;		// A
			4'b1011 : Seg <= 8'b10000011;		// b
			4'b1100 : Seg <= 8'b11000110;		// C
			4'b1101 : Seg <= 8'b10100001;		// d
			4'b1110 : Seg <= 8'b10000110;		// E
			4'b1111 : Seg <= 8'b10001110;		// F
			default : Seg <= 8'b11111111;
	  endcase 
	end
endmodule

五、实验原理
如该语句:4’b0000 : Seg <= 8’b11000000;表示输出的数码是0,其对应的4位控制开关表示的二进制为“0000”,led灯亮灭情况由“11000000”控制,8个开关控制前两位数码的输入,若其他位也想输入数码,则可以通过移动位的方式实现。

六、问题自答
1.如何输入0x55?
0x55转换为十进制为85,将开关拨成“1000”与“0101”,对应的二进制为1010101,亮灯为1,通过拨动相应的开关即可输入0x55。

2.如何使用左移/右移功能?
通过if语句,当满足条件后,执行“Digit<=({Digit[11:0],Digit[15:12]}|0)”与“Digit<=({Digit[3:0],Digit[15:4]}|0”,即:将[11:0]的指令移动至[15:12];将[3:0]的指令移动至[15:4],即实现了左移右移的功能。

3.如何输入更多其他数码,这些数码分别与开关位置有何联系?
8个开关仅能控制前两位数码,要使4位数码都显示,可通过左移右移,使得其他位数码对应到第一第二位的位置上,再进行想要的数值输入。每一个数码的显示,其实是控制灯的亮灭,要想输入其他数码,只需要控制灯的亮灭情况即可。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值