디지털 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의 자습 노트 요약에서 파생되었습니다 ^^
[참고] : 개인 학습 노트, 실수가 있으면 알려주세요. 공손 해요 ~~~