课题:输入输出
一、实验思路
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实验平台
三、实验任务
- 通过8个拨盘开关按每个4位二进制数设置两个数,LED实时显示开关的设置,通过按键将设置的数输入,并在数码管的后两位以十六进制方式显示。
- 时钟信号使用实验板上50MHz时钟(Clk),四个开关的设置从左至右依次为:输入Enter、左移Left、右移Right、复位Rst,其它变量为时钟Clk、二极管显示Led(8位)、七段码显示器位选(Node)、七段码显示器段选(Seg)。
- 七段数码管的显示加小数点共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位数码都显示,可通过左移右移,使得其他位数码对应到第一第二位的位置上,再进行想要的数值输入。每一个数码的显示,其实是控制灯的亮灭,要想输入其他数码,只需要控制灯的亮灭情况即可。