verilog实验报告流水灯数码管秒表交通灯
- 格式:doc
- 大小:131.50 KB
- 文档页数:9
1
流水灯
实验目的:
在basys2开发板上实现LED灯的花样流水的显示,如隔位显示,依次向左移位显示,依次向右移位显示,两边同时靠中间显示。
实验仪器:
FPGA开发板一块,计算机一台。
实验原理:
当一个正向的电流通过LED时,LED就会发光。当阳极的电压高于阴极的电压时,LED就会有电流通过。当在LED上增添一个典型值为1.5V—2.0V之间的电压时,LED就会有电流通过并发光。
实验内容:
顶层模块:输入信号:clk_50MHz(主时钟信号),rst(重置信号),输出信号:[7:0] led(LED灯控制信号)。
module led_top(clkin,rst,led_out);
input clkin, rst;
output [7:0] led_out;
wire clk_1hz;
divider_1hz d0(clkin, rst, clk_1hz);
led l0(clk_1hz, rst, led_out);
endmodule
分频模块:
module divider_1hz(clkin,rst,clkout);
input clkin,rst;
output reg clkout;
reg [24:0] cnt;
always@(posedge clkin, posedge rst)
begin
if(rst) begin
cnt<=0;
clkout<=0; end
else if(cnt==24999999) begin
cnt<=0;
clkout=!clkout; end
else cnt<=cnt+1;
end
endmodule
亮灯信号模块:
2 module led(clkin,rst,led_out);
input clkin,rst;
output [7:0] led_out;
reg [2:0] state;
always@(posedge clkin, posedge rst)
if(rst) state<=0;
else state<=state+1;
always@(state)
case(state)
3'b000:ledout<=8'b0000_0001;
3'b001:ledout<=8'b0000_0010;
3'b010:ledout<=8'b0000_0100;
3'b011:ledout<=8'b0000_1000;
3'b100:ledout<=8'b0001_0000;
3'b101:ledout<=8'b0010_0000;
3'b110:ledout<=8'b0100_0000;
3'b111:ledout<=8'b1000_0000;
endcase
endmodule
实验中存在的问题:
1 芯片选择问题
automotive spartan3E
XA3S100E XA3S250E CPG132
spartan3E
XC3S100E XC3S250E CP132
2 时序逻辑部分,阻塞赋值和非阻塞赋值混用
always@(posedge clk)
begin
a=b+c;
d<=e+f;
end
3 UCF文件格式错误
NET “CLK” LOC = “B8”;
NET “a” LOC = “N11”;
NET “b” LOC = “G13”;
NET “c[0]” LOC =“K11;
数码管
实验目的:
设计一个数码管动态扫描程序,实现在四位数码管上动态循环显示“1”、“2”“3”“4”;
实验仪器:
3 FPGA开发板一块,计算机一台。
实验原理:
实验内容:
1、数码管显示模块:输入端口dataone,datatwo,datathree,datafour,clk,rst,输出端口current_state, digit_select;
module display_scan(current_showdata, scan_current_state, rst, dataone, datatwo,
datathree, datafour, clk_scan
);
output reg [7:0] current_showdata;
output reg [3:0] scan_current_state;
input rst, clk_scan;
input [3:0] dataone, datatwo, datathree, datafour;
wire [7:0] data1,data2,data3,data4;
code_change d1(dataone,data1);
code_change d2(datatwo,data2);
code_change d3(datathree,data3);
code_change d4(datafour,data4);
parameter stateone = 4'b0111,
statetwo = 4'b1011,
statethree = 4'b1101,
statefour = 4'b1110;
always@(posedge rst or posedge clk_scan)
begin
if(rst) scan_current_state <= stateone;
else
case(scan_current_state)
stateone: begin scan_current_state <= statetwo;
4 current_showdata <= data2; end
statetwo: begin scan_current_state <= statethree;
current_showdata <= data3; end
statethree: begin scan_current_state <= statefour;
current_showdata <= data4; end
statefour: begin scan_current_state <= stateone;
current_showdata <= data1; end
default:begin scan_current_state <= stateone;
current_showdata <= data1; end
endcase
end
end
endmodule
2、译码模块
module code_change(datain, dataout);
output [7:0] dataout;
input [3:0] datain;
reg [7:0] dataout;
always@(datain)
case(datain)
1: dataout = 8'b10011111;
2: dataout = 8'b00100101;
3: dataout = 8'b00001101;
4: dataout = 8'b10011001;
5: dataout = 8'b01001001;
6: dataout = 8'b01000001;
7: dataout = 8'b00011111;
8: dataout = 8'b00000001;
9: dataout = 8'b00001001;
0: dataout = 8'b00000011;
endcase
endmodule
Verilog HDL常见错误:
1、进程赋值语句的左侧变量没有声明为寄存器变量;
2 、begin-end没有匹配
3 、写二进制数时忘了标记数基(即’b)。这样,编译器会认作十进制数
4、 inlclude和表示数基的语句使用了错误的撇号;
5 、声明语句的末尾忘了写分号
5 秒表
实验目的:
设计一个秒表,0.001s作为扫描时钟,0.01秒作为百分秒时钟。
实验仪器:
FPGA开发板一块,计算机一台。
实验原理:
把0-99的BCD码计数过程转化成BCD码计数的百分秒、分等过程。
实验内容:
分频模块 divider (0.001s作为扫描时钟,0.01秒作为百分秒时钟);
module miaobiao(mh,ml,sh,sl,msh,msl,clk,clr,pause);
output [3:0] mh,ml,sh,sl,msh,msl;
input clk,clr,pause;
reg [3:0] mh,ml,sh,sl,msh,msl;
reg cn1,cn2;
秒表计时模块 (百分秒模块 秒模块 分模块);
百分秒模块:
always@(posedge clk,posedge clr)
begin
if(clr) begin msh<=0;msl<=0;cn1<=0;end
else if(!pause)
begin
if(msl==9)
begin
msl<=0;
if(msh==9) begin msh<=0;cn1<=1;end
else msh<=msh+1;
end
else begin msl<=msl+1;cn1<=0;end
end
end
秒模块
always@(posedge cn1,posedge clr)
begin
if(clr) begin sh<=0;sl<=0;cn2<=0;end
else
begin
if(sl==9)
begin
sl<=0;
if(sh==5) begin sh<=0;cn2<=1;end
else sh<=sh+1;
end