목차
1. 디지털 튜브 정적 디스플레이
FPGA의 디지털 튜브에는 4비트와 8개의 세그먼트가 있습니다 . ( 비트와 세그먼트는 공통 긍정, 즉 낮은 수준이 활성화됨 )
비트(바이너리)에 의해 선택된 4비트: 각각 1st, 2nd, 3rd 및 4th 디지털 튜브.
세그먼트 선택의 8비트(바이너리): 각각 h, g, f, e, d, c, b, a 세그먼트.
다음은 숫자 "1"을 표시하기 위해 4자리(모두) 디지털 튜브를 사용합니다.
//数码管(共阳:低电平有效)
//FPGA的数码管:段选和位选都共阳
module my_and(dig, seg);
output wire [3:0] dig; //位选(选定某一个数码管)
output wire [7:0] seg; //段选(选定一个数码管上的小段)
assign dig = 4'b0000; //位选(0000:4个零,共4个数码管,全选)
assign seg = 8'b1111_1001; //段选(第6、7段为0,显示的是“1”)
endmodule
두, 디지털 튜브 동적 디스플레이
다른 숫자를 표시해야 하므로 FPGA의 디지털 튜브는 개별적으로 작동할 수 없으며 그룹으로만 작동할 수 있습니다.
따라서 각 디지털 튜브에 다른 주파수를 부여한 다음 차례로 표시할 수 있습니다.
참고: 여기에서 주파수가 적절해야 합니다:
너무 빠른 주파수: 앨리어싱이 발생하기 쉽고,
너무 느린 주파수, 느린 변화, 명백한 흐름 표시.
빈도가 너무 느림(파이프라인 변경):
주파수가 너무 빠름(앨리어싱):
정상 주파수:
1. 변수 정의
module my_and(dig, seg, clk, rst_n);
input clk, rst_n;
output reg [7:0] seg; //段选(选定一个数码管上的小段)
output reg [3:0] dig; //位选(选定某一个数码管)
reg [25:0] cnt;
reg [1:0] wei;
2. 타이밍(60us)
시간이 60us이므로 비트가 한 번 변경됩니다 .
//定时(60us变化位变化一次)
always@ (posedge clk, negedge rst_n)
begin
//按下复位键(清空)
if(!rst_n)
cnt <= 1'b0; //清空
else if(cnt != 12'd3000) //60us(3000*20ns=60us)
cnt <= cnt + 1'b1;//加1
else
begin
cnt <= 1'b0; //清空
wei <= wei + 1; //位+1
end
end
3. 다이내믹 디스플레이
여기서 비트(dig)와 세그먼트(seg)가 바뀌고, 세그먼트는 비트에 따라 바뀝니다.
//动态显示
always@(*)
begin
case(wei)
//2
2'b00:
begin
dig <= 4'b0111;
seg <= 8'b1010_0100;
end
//5
2'b01:
begin
dig <= 4'b1011;
seg <= 8'b1001_0010;
end
//0
2'b10:
begin
dig <= 4'b1101;
seg <= 8'b1100_0000;
end
//8
2'b11:
begin
dig <= 4'b1110;
seg <= 8'b1000_0000;
end
endcase
end
코드
//数码管动态显示(共阳:低电平有效)
//由于要显示不同的数字,但是FPGA的数码管没办法单独操作,只能群操作。
//所以只能给每个数码管不同的频率,然后依次显示
//注:这里频率要给适当,
//频率过快:容易发生混叠;
//频率过慢,变化慢,明显的流水式显示
/*对照表
4'h0 : seg = 8'hc0; //显示"0"
4'h1 : seg = 8'hf9; //显示"1"
4'h2 : seg = 8'ha4; //显示"2"
4'h3 : seg = 8'hb0; //显示"3"
4'h4 : seg = 8'h99; //显示"4"
4'h5 : seg = 8'h92; //显示"5"
4'h6 : seg = 8'h82; //显示"6"
4'h7 : seg = 8'hf8; //显示"7"
4'h8 : seg = 8'h80; //显示"8"
4'h9 : seg = 8'h90; //显示"9"
4'ha : seg = 8'h88; //显示"a"
4'hb : seg = 8'h83; //显示"b"
4'hc : seg = 8'hc6; //显示"c"
4'hd : seg = 8'ha1; //显示"d"
4'he : seg = 8'h86; //显示"e"
4'hf : seg = 8'h8e; //显示"f"
*/
module my_and(dig, seg, clk, rst_n);
input clk, rst_n;
output reg [7:0] seg; //段选(选定一个数码管上的小段)
output reg [3:0] dig; //位选(选定某一个数码管)
reg [25:0] cnt;
reg [1:0] wei;
//定时(60us变化位变化一次)
always@ (posedge clk, negedge rst_n)
begin
//按下复位键(清空)
if(!rst_n)
cnt <= 1'b0; //清空
else if(cnt != 12'd3000) //60us(3000*20ns=60us)
cnt <= cnt + 1'b1;//加1
else
begin
cnt <= 1'b0; //清空
wei <= wei + 1; //位+1
end
end
//动态显示
always@(*)
begin
case(wei)
//2
2'b00:
begin
dig <= 4'b0111;
seg <= 8'b1010_0100;
end
//5
2'b01:
begin
dig <= 4'b1011;
seg <= 8'b1001_0010;
end
//0
2'b10:
begin
dig <= 4'b1101;
seg <= 8'b1100_0000;
end
//8
2'b11:
begin
dig <= 4'b1110;
seg <= 8'b1000_0000;
end
endcase
end
endmodule