디지털 IC 설계 연구 노트 _8 비트 7 세그먼트 디지털 튜브 2

디지털 IC 설계 연구 노트

8 자리 7 세그먼트 디지털 튜브 2

1 原理图
2 Verilog 代码
3 Modelsim仿真

1. 회로도

  • AC620 개발 보드의 모듈은 디지털 튜브의 직접 구동을 지원하지 않기 때문에 두 개의 74HC595 모듈을 연결하여 직렬 데이터를 디지털 튜브의 병렬 데이터로 변환해야하며 HC595_driver를 사용하여 원래 디자인 (HEX8)을 출력합니다. ) 신호는 HC595, DS, SHCP, STCP에 적합한 신호로 변환됩니다.

(1). 시스템의 전체 개략도
여기에 사진 설명 삽입

(2) 74HC595의 타이밍 다이어그램

여기에 사진 설명 삽입
(3) .HC595_driver 타이밍 다이어그램
여기에 사진 설명 삽입

2 Verilog 코드

module hc595_driver#(
	parameter CNT_MAX = 2
)
(
	input clk, //50MHz = 20ns
	input rst_n,
	input en,
	input [15:0] data1,
	
	output reg DS,
	output reg SHCP, //12.5MHz, 80ns=1:40ns+0:40ns
	output reg STCP//latch
);
	reg [7:0] div_cnt; //freq divid counter
	reg [5:0] flag_cnt;
	wire sck_flag;
	reg [15:0] data_reg;
	
//----en--------------------------------------
	always@(posedge clk)
		if(en)	
			data_reg <= data1;
		else
			data_reg <= data_reg;
//----div_cnt---------------------------------
	always@(posedge clk or negedge rst_n)
		if(!rst_n)
			div_cnt <= 0;
		else if(div_cnt == CNT_MAX-1)
			div_cnt <= 0;
		else
			div_cnt <= div_cnt + 1'd1;

	assign sck_flag = (div_cnt == CNT_MAX-1'd1)? 1'd1:1'd0;

//----flag_cnt---------------------------------
	always@(posedge clk or negedge rst_n)
		if(!rst_n)
			flag_cnt <= 0;
		else if(sck_flag) begin
			if (flag_cnt == 32)
				flag_cnt <= 0;
			else
			flag_cnt <= flag_cnt + 1'd1;
			end
		else
			flag_cnt <= flag_cnt;

//----STCP(latch)-DS--SHCP---------------------------
	always@(posedge clk or negedge rst_n)
		if(!rst_n)begin
			STCP <= 0;
			DS <= 0;
			SHCP <= 0;
		end
		else begin
			case(flag_cnt)
			0: begin
					SHCP <= 0;
					DS <= data_reg[15];
					STCP <= 0;
				end
			1: begin
					SHCP <= 1;
					DS <= data_reg[15];
					STCP <= STCP;
				end
			2: begin
					SHCP <= 0;
					DS <= data_reg[14];
					STCP <= STCP;
				end
			3: begin
					SHCP <= 1;
					DS <= data_reg[14];
					STCP <= STCP;
				end
			4: begin
					SHCP <= 0;
					DS <= data_reg[13];
					STCP <= STCP;
				end	
			5: begin
					SHCP <= 1;
					DS <= data_reg[13];
					STCP <= STCP;
				end
			6: begin
					SHCP <= 0;
					DS <= data_reg[12];
					STCP <= STCP;
				end	
			7: begin
					SHCP <= 1;
					DS <= data_reg[12];
					STCP <= STCP;
				end
			8: begin
					SHCP <= 0;
					DS <= data_reg[11];
					STCP <= STCP;
				end	
			9: begin
					SHCP <= 1;
					DS <= data_reg[11];
					STCP <= STCP;
				end
			10: begin
					SHCP <= 0;
					DS <= data_reg[10];
					STCP <= STCP;
				end	
			11: begin
					SHCP <= 1;
					DS <= data_reg[10];
					STCP <= STCP;
				end
			12: begin
					SHCP <= 0;
					DS <= data_reg[9];
					STCP <= STCP;
				end	
			13: begin
					SHCP <= 1;
					DS <= data_reg[9];
					STCP <= STCP;
				end
			14: begin
					SHCP <= 0;
					DS <= data_reg[8];
					STCP <= STCP;
				end	
			15: begin
					SHCP <= 1;
					DS <= data_reg[8];
					STCP <= STCP;
				end
			16: begin
					SHCP <= 0;
					DS <= data_reg[7];
					STCP <= STCP;
				end	
			17: begin
					SHCP <= 1;
					DS <= data_reg[7];
					STCP <= STCP;
				end
			18: begin
					SHCP <= 0;
					DS <= data_reg[6];
					STCP <= STCP;
				end
			19: begin
					SHCP <= 1;
					DS <= data_reg[6];
					STCP <= STCP;
				end
			20: begin
					SHCP <= 0;
					DS <= data_reg[5];
					STCP <= STCP;
				end
			21: begin
					SHCP <= 1;
					DS <= data_reg[5];
					STCP <= STCP;
				end
			22: begin
					SHCP <= 0;
					DS <= data_reg[4];
					STCP <= STCP;
				end
			23: begin
					SHCP <= 1;
					DS <= data_reg[4];
					STCP <= STCP;
				end
			24: begin
					SHCP <= 0;
					DS <= data_reg[3];
					STCP <= STCP;
				end
			25: begin
					SHCP <= 1;
					DS <= data_reg[3];
					STCP <= STCP;
				end
			26: begin
					SHCP <= 0;
					DS <= data_reg[2];
					STCP <= STCP;
				end
			27: begin
					SHCP <= 1;
					DS <= data_reg[2];
					STCP <= STCP;
				end
			28: begin
					SHCP <= 0;
					DS <= data_reg[1];
					STCP <= STCP;
				end
			29: begin
					SHCP <= 1;
					DS <= data_reg[1];
					STCP <= STCP;
				end
			30: begin
					SHCP <= 0;
					DS <= data_reg[0];
					STCP <= STCP;
				end
			31: begin
					SHCP <= 1;
					DS <= data_reg[0];
					STCP <= STCP;
				end
			32: begin
					STCP <= 1;
				end				
				default: begin
					SHCP <= 0;
					DS <= 1'b0;
					STCP <= 0;
				end
			endcase
		end
		
endmodule

	
endmodule
//-------------------------------------------------
//----testbench--------------------------------
`timescale 1ns/1ns
`define clock_period 20
module hc595_driver_tb;
	reg clk;
	reg rst_n;
	reg [15:0] data;
	reg en;
	
	wire DS;
	wire SHCP;
	wire STCP;

hc595_driver uut(
	.clk(clk), //50MHz = 20ns
	.rst_n(rst_n),
	.en(en),
	.data1(data),
	
	.DS(DS),
	.SHCP(SHCP), //12.5MHz, 80ns=1:40ns+0:40ns
	.STCP(STCP)//latch
);
	initial clk = 1;
	always #(`clock_period/2) clk = ~clk;
	
	initial begin
		rst_n = 0;
		en = 0;
		data = 16'h9876;
		#1000;
		rst_n = 1;
		#304;
		en = 1;
		#3000;
		en = 0;	
		#20000;
		data = 16'hfedc;
		#3000;
		en = 1;
		#3000;
		en = 0;
		#3000;
		$stop;
		end
endmodule

3. Modelsim 시뮬레이션
여기에 사진 설명 삽입

내용은 Xiaomei FPGA의 자습 노트 요약에서 파생되었습니다 ^^

[참고] : 개인 학습 노트, 실수가 있으면 알려주세요. 공손 해요 ~~~

추천

출처blog.csdn.net/weixin_50722839/article/details/109689025