You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
2.6 KiB
Verilog
135 lines
2.6 KiB
Verilog
`timescale 1ns/1ns
|
|
|
|
module tb_lm();
|
|
|
|
reg k_1; // 显示的图像1
|
|
reg k_2; // 显示的图像2
|
|
|
|
reg key; // 物理按键 开关显示, 该按键异步的, 每次按下 等于
|
|
|
|
reg key_1; // 物理按键的随时钟同步变化信号
|
|
reg key_2; //
|
|
reg is_show; // 互斥变化的
|
|
|
|
reg flag; // 状态改变周期 现在500ns改变一次状态, 显示相反的图像
|
|
|
|
reg sys_clk;
|
|
reg sys_rst;
|
|
|
|
|
|
always #10 sys_clk = ~sys_clk;
|
|
|
|
initial begin
|
|
sys_clk <= 1'b0;
|
|
sys_rst <= 1'b0;
|
|
#200
|
|
sys_rst <= 1'b1;
|
|
|
|
// 延迟2000纳秒, 现在x 应该是0
|
|
#2000
|
|
|
|
// 按下一次key, 持续188纳秒
|
|
key <= 1'b1;
|
|
#188
|
|
key <= 1'b0;
|
|
#400
|
|
|
|
// 延迟4000纳秒观察
|
|
{k_2, k_1} <= 2'b10;
|
|
#3900
|
|
{k_2, k_1} <= 2'b01;
|
|
#3800
|
|
|
|
// 按下一次key, 持续288纳秒, 现在应该是关闭显示了, x为0
|
|
key <= 1'b1;
|
|
#288
|
|
key <= 1'b0;
|
|
end
|
|
|
|
|
|
reg [5:0] CNT;
|
|
always @(posedge sys_clk or negedge sys_rst) begin
|
|
if (sys_rst == 1'b0) begin
|
|
CNT <= 5'd0;
|
|
end
|
|
else if (CNT < (5'd25 - 5'd1)) begin
|
|
CNT <= CNT + 5'd1;
|
|
end
|
|
else begin
|
|
CNT <= 5'b0;
|
|
end
|
|
end
|
|
|
|
|
|
reg [7:0]x;
|
|
reg [7:0]y;
|
|
always @(posedge sys_clk or negedge sys_rst) begin
|
|
if (sys_rst == 1'b0) begin
|
|
{k_2, k_1} <= 2'b11;
|
|
x <= 8'b00000000;
|
|
y <= 8'b11111111; // 所有的都显示算了
|
|
end
|
|
else if ({k_2, k_1} == 2'b10 && is_show) begin
|
|
case (flag)
|
|
1'b0: x <= 8'b1010_1010;
|
|
1'b1: x <= 8'b0101_0101;
|
|
endcase
|
|
end
|
|
else if ({k_2, k_1} == 2'b01 && is_show) begin
|
|
case (flag)
|
|
1'b0: x <= 8'b1111_0000;
|
|
1'b1: x <= 8'b0000_1111;
|
|
endcase
|
|
end
|
|
else begin
|
|
x <= 8'b00000000;
|
|
end
|
|
end
|
|
|
|
always @(posedge sys_clk or negedge sys_rst) begin
|
|
if (sys_rst == 1'b0) begin
|
|
flag <= 1'b0;
|
|
end
|
|
else if (CNT == (5'd25 - 5'd1)) begin
|
|
flag <= !flag;
|
|
end
|
|
else begin
|
|
end
|
|
end
|
|
|
|
|
|
always @(posedge sys_clk or negedge sys_rst) begin
|
|
if (sys_rst == 1'b0) begin
|
|
key <= 1'b0;
|
|
key_1 <= 1'b0;
|
|
key_2 <= 1'b0;
|
|
end
|
|
else begin
|
|
key_1 <= key;
|
|
key_2 <= key_1;
|
|
end
|
|
end
|
|
|
|
// 用一个时钟周期即可判断是否在当前时钟周期上升沿之前, 按下了按键
|
|
assign is_click = key_1 && !key_2;
|
|
// 使用时钟约束一下
|
|
always @(posedge sys_clk or negedge sys_rst) begin
|
|
if (sys_rst == 1'b0) begin
|
|
is_show <= 1'b0;
|
|
end
|
|
else if (is_click) begin
|
|
is_show <= !is_show;
|
|
end
|
|
else begin
|
|
end
|
|
end
|
|
|
|
|
|
|
|
lm u_lm(
|
|
.x (x),
|
|
.y (y)
|
|
);
|
|
|
|
|
|
endmodule |