FPGA(5) 디지털 튜브의 정적 디스플레이 및 동적 디스플레이

목차

1. 디지털 튜브 정적 디스플레이

두, 디지털 튜브 동적 디스플레이

1. 변수 정의

2. 타이밍(60us)

3. 다이내믹 디스플레이

코드


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

추천

출처blog.csdn.net/great_yzl/article/details/121446409