?? ad0804.v
字號:
module ad0804(clk, //脈寬(至少100ns)
rst_n,scl,
EOC, //約100us后EOC變為高電平轉換結束
START, //啟動信號,上升沿有效(至少100ns)
OE, //高電平打開三態緩沖器輸出轉換數據
ALE, //高電平有效,選擇信道口
//因為ADDB,ADDC都接地了,這里只有ADDA為變量
d1,d2,d3,d4,d5,d6,d7,d8,// //轉換數據
led1,led2,led3,led4,led5,led6,led7,led8);
output START,OE,ALE,led1,led2,led3,led4,led5,led6,led7,led8,scl;
input EOC,clk,rst_n;
input d1,d2,d3,d4,d5,d6,d7,d8;
//output[7:0] DATA_R;
reg START,OE,ALE,ADDA;
reg[7:0] DATA_R;
reg[4:0] CS,NS;
reg s1,s2,s3,s4,s5,s6,s7,s8,led1,led2,led3,led4,led5,led6,led7,led8;
parameter IDLE=5'b00001,START_H=5'b00010,START_L=5'b00100,CHECK_END=5'b01000,GET_DATA=5'b10000;
reg [9:0]temp;
reg scl;
always @(posedge clk or negedge rst_n)
if(!rst_n) begin
temp<=8'd0;
scl<=1'b0;end
else if(temp==78) begin
temp<=1'd0;
scl<=~scl;end
else temp<=temp+1;
always @(posedge scl)
case(CS)
IDLE:
NS=START_H;
START_H:
NS=START_L;
START_L:
NS=CHECK_END;
CHECK_END:
if(!EOC)
NS=GET_DATA;
else
NS=CHECK_END;
GET_DATA:
NS=IDLE;
default:
NS=IDLE;
endcase
always @(posedge scl)
if(!rst_n)
CS<=IDLE;
else
CS<=NS;
always @(posedge clk)
case(NS)
IDLE:
begin
OE<=1;
START<=1;
ALE<=0;
led1<=s1;
led2<=s2;
led3<=s3;
led4<=s4;
led5<=s5;
led6<=s6;
led7<=s7;
led8<=s8;
end
START_H:
begin
OE<=1;
START<=0; //產生啟動信號 one state should last more than 100ns
ALE<=0;//選擇信道口IN0
end
START_L:
begin
OE<=1;
START<=1;
ALE<=0;//啟動信號脈寬要足夠長,在啟動的時候ALE要一直有效
end
CHECK_END:
begin
OE<=1;
START<=1;
ALE<=0;
end
GET_DATA:
begin
OE<=0; //高電平打開三態緩沖器輸出轉換數據
// DATA_R<=DATA;//提取轉換數據
s1<=d1;
s2<=d2;
s3<=d3;
s4<=d4;
s5<=d5;
s6<=d6;
s7<=d7;
s8<=d8;
led1<=s1;
led2<=s2;
led3<=s3;
led4<=s4;
led5<=s5;
led6<=s6;
led7<=s7;
led8<=s8;
START<=0;
ALE<=0;
end
default:
begin
OE<=1;
START<=1;
ALE<=0;
end
endcase
endmodule
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -