注:相应的源文件在文末的github链接中
实验二 Vivado环境下时序逻辑电路的设计与仿真
一.实验要求
二.加法计数器的实现
源文件
module addcounter(clk,Q) ;
input clk ;
output[3 :0] Q ;
reg[3 :0] Q ;
initial Q = 4'b0000; //给加法器初始化
always @(posedge clk)
begin Q<=Q+1 ;
end endmodule
激励文件(注意可能需要改变延时时间为自己的学号)
module addcounter_tb();
reg clk; //输入信号
wire [3:0] Q; //输出信号
addcounter ac(clk,Q); //调用实例
initial
begin//这个其实就是真值表的应用
clk = 0;
end
always #73 clk = ~clk;
endmodule
激励图像
三.减法计数器的实现
源文件
module subcounter(clk,Q) ;
input clk ;
output[3 :0] Q ;
reg[3 :0] Q ;
initial Q = 4'b1111; //给减法器初始化
always @(posedge clk)
begin Q<=Q-1 ;
end endmodule
激励文件(注意可能需要改变延时时间为自己的学号)
module subcounter_tb();
reg clk; //输入信号
wire [3:0] Q; //输出信号
subcounter ac(clk,Q); //调用实例
initial
begin//这个其实就是真值表的应用
clk = 0;
end
always #73 clk = ~clk;
endmodule
激励图像
四.有限状态机设计时序控制电路的实现
要求
流水灯的实验结果,通过拨码开关sw的选择可以显示两种方式的流水灯。
如果将上面例3的状态机代码,编译后生成的bit文件下载到EGO1开发板上,并且管脚分配表如下:(下载部分不需要完成)
程序中管脚名 | 实际管脚 | 说明 |
clk | P17 | clk时序电路时钟100MHZ |
reset | P15 | 复位控制 |
SW | P5 | 拨动开关 SW0 |
DATA[0] | F6 | LED0 |
DATA[1] | G4 | LED1 |
DATA[2] | G3 | LED2 |
DATA[3] | J4 | LED3 |
例3的实验结果如下(仅供参考):
拨动开关 sw0 值 | LED0 | LED1 | LED2 | LED3 |
1 | 从左至右逐次只亮一个灯 | |||
0 | 从左至右逐次只灭一个灯 |
源文件
module led(clk,data,sw);
input clk, sw; // 输入时钟信号和开关信号
output[3:0] data; // 输出LED数据
reg clk1s; // 1秒钟时钟
parameter max=5000000; // 最大计数值
reg[1:0] state=2'b00; // 状态机状态
reg[30:0] n; // 计数器
reg[3:0] data; // LED数据寄存器
always @(posedge clk) begin
if(n==max) begin
if(!clk1s)
clk1s<=1'b1; // 1秒时钟
else
clk1s<=1'b0;
n<=0; // 计数器复位
end
else
n<=n+1; // 计数器递增
end
always @(posedge clk1s) begin
case(state)
2'b00:begin
state<=2'b01; // 状态转移为01
if(sw) begin
data<=4'b1000; // 如果开关为1,输出1000
end
else begin
data<=4'b0111; // 如果开关为0,输出0111
end
end
2'b01:begin
state<=2'b10; // 状态转移为10
if(sw) begin
data<=4'b0100; // 如果开关为1,输出0100
end
else begin
data<=4'b1011; // 如果开关为0,输出1011
end
end
2'b10:begin
state<=2'b11; // 状态转移为11
if(sw) begin
data<=4'b0010; // 如果开关为1,输出0010
end
else begin
data<=4'b1101; // 如果开关为0,输出1101
end
end
2'b11:begin
state<=2'b00; // 状态转移为00
if(sw) begin
data<=4'b0001; // 如果开关为1,输出0001
end
else begin
data<=4'b1110; // 如果开关为0,输出1110
end
end
endcase
end
endmodule
激励文件(注意可能需要改变延时时间为自己的学号)
module tb_led();
// 输入
reg clk;
reg sw;
// 输出
wire [3:0] data;
// 实例化
led UUT (
.clk(clk),
.data(data),
.sw(sw)
);
// 时钟信号
always #10 clk = ~clk; // Assuming 10ns clock period
// 激励初始化
initial begin
clk = 0;
sw = 0;
#73 sw = 1;
#73 sw = 0;
#73 sw = 1;
#73 sw = 1;
#73 sw = 0;
#73 sw = 1;
$finish;
end
endmodule