今天调了一天TLC549,从网上找到个程序是可以用的,然后自己写了一个,死活不对。希望有用过的给讲一下:
module TLC549
(
input sys_clk,
input sys_rstn,
output AD_Cs,
output AD_Clk,
input AD_In,
output reg [7:0] Data_Out
);
reg[6:0] Count;
reg En_Count;
always @(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
begin
Count <= 7'b0;
end
else if(Count==7'd25)
Count <= 7'd0;
else if(En_Count)
Count <= Count+1'b1;
else
Count <=7'd0;
end
reg [5:0] i;
reg AD_Cs_r;
reg AD_Clk_r;
reg [7:0] Data_Out_r;
always@(posedge sys_clk or negedge sys_rstn)
if(!sys_rstn)
begin
i<=6'd0;
AD_Cs_r<=1'b1;
AD_Clk_r<=1'b0;
Data_Out_r<=8'd0;
En_Count<=1'b0;
end
else
case(i)
0,1,2,3:
if(Count==7'd25) begin En_Count<=1'b0;i<=i+1'b1;end
else begin En_Count<=1'b1;AD_Cs_r<=1'b0;end
4,6,8,10,12,14,16,18:
if(Count==7'd25) begin En_Count<=1'b0;i<=i+1'b1;end
else begin En_Count<=1'b1;Data_Out_r<={Data_Out_r[6:0],AD_In};AD_Clk_r<=1'b1;end
5,7,9,11,13,15,17,19:
if(Count==7'd25) begin En_Count<=1'b0;i<=i+1'b1;end
else begin En_Count<=1'b1;AD_Clk_r<=1'b0;end
20:
if(Count==7'd25) begin En_Count<=1'b0;i<=i+1'b1;end
else begin En_Count<=1'b1;AD_Cs_r<=1'b1;end
default:
if(Count==7'd25) begin En_Count<=1'b0;i<=i+1'b1;end
else begin En_Count<=1'b1;Data_Out<=Data_Out_r;end
endcase
assign AD_Clk=AD_Clk_r;
assign AD_Cs=AD_Cs_r;
endmodule
不知道哪里不对,故障现象是什么
粗粗看了一下,这个思路和风格有些C化
一个问题是:在时钟sys_clk 来时
else if(Count==7'd25)
Count <= 7'd0;
if(Count==7'd25) begin En_Count<=1'b0;i<=i+1'b1;end
else begin En_Count<=1'b1;Data_Out_r<={Data_Out_r[6:0],AD_In};AD_Clk_r<=1'b1;end
这二者间可能有些问题。
请参考下例子的代码风格
Net:Wxeda.taobao.com
QQ:1035868547
Blog:https://home.eeworld.com.cn/space-uid-390804.html
回复 沙发kdy 的帖子
谢谢kdy,找到问题了:
4,6,8,10,12,14,16,18:
if(Count==7'd25) begin En_Count<=1'b0;i<=i+1'b1;end
else begin En_Count<=1'b1;Data_Out_r<={Data_Out_r[6:0],AD_In};AD_Clk_r<=1'b1;end
这个地方出问题了,Data_Out_r<={Data_Out_r[6:0],AD_In};这条语句应该只执行一边就可以了,可是我的写法在等待期间一直在执行,所以造成了错误,我整理下,去咱们分区发个帖。