lmx2594的verilog驱动

2023-05-16

应朋友请求写了一个纯VERILOG的LMX2594的配置。

首先写一个SPI的接口:



/*

 lmx2594_spi_master lmx2594_spi_master (
 .clk() ,
 .rst(),
 .W0R1(), 
 .pin_mosi(),
 .pin_sclk(),  
 .pin_miso(), 
 .wr(),  
 .busy(), 
 .addr() ,  
 .din(),  
 .dout() 
);
 
*/


module lmx2594_spi_master (
input clk,rst,W0R1,
output reg  pin_mosi,pin_sclk,pin_csn,
input pin_miso,
input wr,
output busy,
input [6:0] addr ,
input [15:0] din,
output reg [15:0] dout 
);
 

reg [3:0] d ; always @ (posedge clk) if (rst) d<=0; else d<=d+1;

wire move = d == 0; 

reg [7:0] st ;
reg [23:0] reg24   ; always@(posedge clk)  if (wr&st==10) reg24 <= {W0R1,addr[6:0],din[15:0]};
reg[23:0] result24;  always@(posedge clk)  if (st==148  ) dout <= result24[15:0] ;
reg  pin_miso_r ;    always@(posedge clk)   pin_miso_r<= pin_miso;
always@(posedge clk)   if (st==20)pin_csn<= 1'b0 ;else if ((st==149) ||(st==0)) pin_csn<= 1'b1 ;



always@(posedge clk)  if (rst) st<=0; else case(st)

0  :  begin  st <= 10 ; pin_mosi<=0;pin_sclk<=0;end  

10 : begin   pin_mosi<=0;pin_sclk<=0; if (  wr  ) st<=20  ;end  
20 :   if ( move ) st<=21  ;
21 :   if ( move ) st<=100 ; 
/*
main(){
int i ,j;for(i=j=0;i<24*2;){
printf("%d: begin   pin_sclk<=0;      pin_mosi<=  reg24[%d] ;  if (move) st<=st+1 ;    end \n",100+i,(23-j));++i;
printf("%d: begin   pin_sclk<=1;      pin_mosi<=  reg24[%d] ;  result24[%d] <= pin_miso_r;if (move) st<=st+1 ;    end \n\n",100+i,(23-j),(23-j)); j++; ++i;
}}
*/
100: begin   pin_sclk<=0;      pin_mosi<=  reg24[23] ;  if (move) st<=st+1 ;    end 
101: begin   pin_sclk<=1;      pin_mosi<=  reg24[23] ;  result24[23] <= pin_miso_r;if (move) st<=st+1 ;    end 

102: begin   pin_sclk<=0;      pin_mosi<=  reg24[22] ;  if (move) st<=st+1 ;    end 
103: begin   pin_sclk<=1;      pin_mosi<=  reg24[22] ;  result24[22] <= pin_miso_r;if (move) st<=st+1 ;    end 

104: begin   pin_sclk<=0;      pin_mosi<=  reg24[21] ;  if (move) st<=st+1 ;    end 
105: begin   pin_sclk<=1;      pin_mosi<=  reg24[21] ;  result24[21] <= pin_miso_r;if (move) st<=st+1 ;    end 

106: begin   pin_sclk<=0;      pin_mosi<=  reg24[20] ;  if (move) st<=st+1 ;    end 
107: begin   pin_sclk<=1;      pin_mosi<=  reg24[20] ;  result24[20] <= pin_miso_r;if (move) st<=st+1 ;    end 

108: begin   pin_sclk<=0;      pin_mosi<=  reg24[19] ;  if (move) st<=st+1 ;    end 
109: begin   pin_sclk<=1;      pin_mosi<=  reg24[19] ;  result24[19] <= pin_miso_r;if (move) st<=st+1 ;    end 

110: begin   pin_sclk<=0;      pin_mosi<=  reg24[18] ;  if (move) st<=st+1 ;    end 
111: begin   pin_sclk<=1;      pin_mosi<=  reg24[18] ;  result24[18] <= pin_miso_r;if (move) st<=st+1 ;    end 

112: begin   pin_sclk<=0;      pin_mosi<=  reg24[17] ;  if (move) st<=st+1 ;    end 
113: begin   pin_sclk<=1;      pin_mosi<=  reg24[17] ;  result24[17] <= pin_miso_r;if (move) st<=st+1 ;    end 

114: begin   pin_sclk<=0;      pin_mosi<=  reg24[16] ;  if (move) st<=st+1 ;    end 
115: begin   pin_sclk<=1;      pin_mosi<=  reg24[16] ;  result24[16] <= pin_miso_r;if (move) st<=st+1 ;    end 

116: begin   pin_sclk<=0;      pin_mosi<=  reg24[15] ;  if (move) st<=st+1 ;    end 
117: begin   pin_sclk<=1;      pin_mosi<=  reg24[15] ;  result24[15] <= pin_miso_r;if (move) st<=st+1 ;    end 

118: begin   pin_sclk<=0;      pin_mosi<=  reg24[14] ;  if (move) st<=st+1 ;    end 
119: begin   pin_sclk<=1;      pin_mosi<=  reg24[14] ;  result24[14] <= pin_miso_r;if (move) st<=st+1 ;    end 

120: begin   pin_sclk<=0;      pin_mosi<=  reg24[13] ;  if (move) st<=st+1 ;    end 
121: begin   pin_sclk<=1;      pin_mosi<=  reg24[13] ;  result24[13] <= pin_miso_r;if (move) st<=st+1 ;    end 

122: begin   pin_sclk<=0;      pin_mosi<=  reg24[12] ;  if (move) st<=st+1 ;    end 
123: begin   pin_sclk<=1;      pin_mosi<=  reg24[12] ;  result24[12] <= pin_miso_r;if (move) st<=st+1 ;    end 

124: begin   pin_sclk<=0;      pin_mosi<=  reg24[11] ;  if (move) st<=st+1 ;    end 
125: begin   pin_sclk<=1;      pin_mosi<=  reg24[11] ;  result24[11] <= pin_miso_r;if (move) st<=st+1 ;    end 

126: begin   pin_sclk<=0;      pin_mosi<=  reg24[10] ;  if (move) st<=st+1 ;    end 
127: begin   pin_sclk<=1;      pin_mosi<=  reg24[10] ;  result24[10] <= pin_miso_r;if (move) st<=st+1 ;    end 

128: begin   pin_sclk<=0;      pin_mosi<=  reg24[9] ;  if (move) st<=st+1 ;    end 
129: begin   pin_sclk<=1;      pin_mosi<=  reg24[9] ;  result24[9] <= pin_miso_r;if (move) st<=st+1 ;    end 

130: begin   pin_sclk<=0;      pin_mosi<=  reg24[8] ;  if (move) st<=st+1 ;    end 
131: begin   pin_sclk<=1;      pin_mosi<=  reg24[8] ;  result24[8] <= pin_miso_r;if (move) st<=st+1 ;    end 

132: begin   pin_sclk<=0;      pin_mosi<=  reg24[7] ;  if (move) st<=st+1 ;    end 
133: begin   pin_sclk<=1;      pin_mosi<=  reg24[7] ;  result24[7] <= pin_miso_r;if (move) st<=st+1 ;    end 

134: begin   pin_sclk<=0;      pin_mosi<=  reg24[6] ;  if (move) st<=st+1 ;    end 
135: begin   pin_sclk<=1;      pin_mosi<=  reg24[6] ;  result24[6] <= pin_miso_r;if (move) st<=st+1 ;    end 

136: begin   pin_sclk<=0;      pin_mosi<=  reg24[5] ;  if (move) st<=st+1 ;    end 
137: begin   pin_sclk<=1;      pin_mosi<=  reg24[5] ;  result24[5] <= pin_miso_r;if (move) st<=st+1 ;    end 

138: begin   pin_sclk<=0;      pin_mosi<=  reg24[4] ;  if (move) st<=st+1 ;    end 
139: begin   pin_sclk<=1;      pin_mosi<=  reg24[4] ;  result24[4] <= pin_miso_r;if (move) st<=st+1 ;    end 

140: begin   pin_sclk<=0;      pin_mosi<=  reg24[3] ;  if (move) st<=st+1 ;    end 
141: begin   pin_sclk<=1;      pin_mosi<=  reg24[3] ;  result24[3] <= pin_miso_r;if (move) st<=st+1 ;    end 

142: begin   pin_sclk<=0;      pin_mosi<=  reg24[2] ;  if (move) st<=st+1 ;    end 
143: begin   pin_sclk<=1;      pin_mosi<=  reg24[2] ;  result24[2] <= pin_miso_r;if (move) st<=st+1 ;    end 

144: begin   pin_sclk<=0;      pin_mosi<=  reg24[1] ;  if (move) st<=st+1 ;    end 
145: begin   pin_sclk<=1;      pin_mosi<=  reg24[1] ;  result24[1] <= pin_miso_r;if (move) st<=st+1 ;    end 

146: begin   pin_sclk<=0;      pin_mosi<=  reg24[0] ;  if (move) st<=st+1 ;    end 
147: begin   pin_sclk<=1;      pin_mosi<=  reg24[0] ;  result24[0] <= pin_miso_r;if (move) st<=st+1 ;    end 

148: begin   pin_sclk<=0; if (move)  st<=st+1;end 
149: begin   pin_sclk<=0; if (move)  st<=st+1;end 
150: begin   pin_sclk<=0; if (move)  st<=st+1;end 
151: begin                if (move)  st<=10; end
default st<=0;
endcase

assign busy = (wr==1) || (st!=10) ;

endmodule 

之后写一个数组保存配置信息:


/*
cfg_rom cfg_rom(
.clk(),
.rst(),
.clr(),
.read(),
.dout(),
.last() 
);
*/
module cfg_rom(
input clk,rst,clr,read,
output [23:0] dout,
output last 
);
reg [7:0]cntr ;

always@(posedge clk)if (rst|clr) cntr<=0; else if (read) cntr<=cntr+1;
assign last = cntr == 45; 
 
always@(posedge clk) 
case (cntr)

/*
unsigned int  info[]={
0x460000,
0x450000,
0x440089,
0x400077,
0x3E0000,
0x3D0001,
0x3B0000,
0x3003FC,
0x2F08CF,
0x2E0F23,
0x2D0320,
0x2C0000,
0x2B0000,
0x2A0000,
0x2903E8,
0x280000,
0x278204,
0x260198,
0x254000,
0x240841,
0x23119B,
0x22C3EA,
0x212A0A,
0x20210A,
0x1F0401,
0x1E0034,
0x1D0084,
0x1C2924,
0x190000,
0x180509,
0x178842,
0x162300,
0x14012C,
0x130965,
0x0E018C,
0x0D4000,
0x0C7001,
0x0B0018,
0x0A10D8,
0x090302,
0x081084,
0x0728B2,
0x041943,
0x020500,
0x010808,
0x00221C,
0xffffff //ending flag 
};
main(){
	int i ,j;
	for(i=0;i<100;++i)
	{
		if(info[i]==0xffffff) break;
	printf("%2d:dout<=24'h%06x;\n",i,info[i]);
	}
}
*/
 0:dout<=24'h460000;
 1:dout<=24'h450000;
 2:dout<=24'h440089;
 3:dout<=24'h400077;
 4:dout<=24'h3e0000;
 5:dout<=24'h3d0001;
 6:dout<=24'h3b0000;
 7:dout<=24'h3003fc;
 8:dout<=24'h2f08cf;
 9:dout<=24'h2e0f23;
10:dout<=24'h2d0320;
11:dout<=24'h2c0000;
12:dout<=24'h2b0000;
13:dout<=24'h2a0000;
14:dout<=24'h2903e8;
15:dout<=24'h280000;
16:dout<=24'h278204;
17:dout<=24'h260198;
18:dout<=24'h254000;
19:dout<=24'h240841;
20:dout<=24'h23119b;
21:dout<=24'h22c3ea;
22:dout<=24'h212a0a;
23:dout<=24'h20210a;
24:dout<=24'h1f0401;
25:dout<=24'h1e0034;
26:dout<=24'h1d0084;
27:dout<=24'h1c2924;
28:dout<=24'h190000;
29:dout<=24'h180509;
30:dout<=24'h178842;
31:dout<=24'h162300;
32:dout<=24'h14012c;
33:dout<=24'h130965;
34:dout<=24'h0e018c;
35:dout<=24'h0d4000;
36:dout<=24'h0c7001;
37:dout<=24'h0b0018;
38:dout<=24'h0a10d8;
39:dout<=24'h090302;
40:dout<=24'h081084;
41:dout<=24'h0728b2;
42:dout<=24'h041943;
43:dout<=24'h020500;
44:dout<=24'h010808;
45:dout<=24'h00221c;
default dout <= 0 ; 
endcase


endmodule



最后写一个顶层调用模块:



/*
 lmx2594_master  lmx2594_master (
 .clk(),
 .rst(),
 .pin_mosi(),
 .pin_sclk(),
 .pin_miso(),
 .done()  
);
*/

module lmx2594_master (
input clk,rst,
output  pin_mosi,pin_sclk,pin_csn,
input pin_miso,
output reg done  
);
wire [23:0] info24 ;
wire last ,busy ;
reg read = 0 ;
reg clr = 0 ; 
reg wr = 0 ; 
reg [7:0] st ;

reg [31:0]d ;

always @(posedge clk) case (st )
10,32,40:d<=d+1;
default d<=0;
endcase 


always@(posedge clk)clr <= st==2 ; 
always@(posedge clk)read <= wr ; 
always@(posedge clk)wr <= st==31 ; 
always@(posedge clk) if (rst) st<=0; else 
0: st <=1;
1:if (d==100*1000) st<=2;//por time 
2:st<=10;
10: if (last) st<=100;else st<=20;
20: st<=30;  // 
30: st<=31;
31: st<=32; // do wr
32: if (d==10) st<=33;
33: if (busy==0) st<=40;
40: if (d==1000*100) st<=50;
50: st<=10; 
100:st<=100;
default st<=0;
endcase 

always@(posedge clk) done <= st==100;

cfg_rom cfg_rom(
.clk(clk),
.rst(rst),
.clr(clr),
.read(read),
.dout(info24),
.last(last ) 
);

 lmx2594_spi_master lmx2594_spi_master (
 .clk(clk) ,
 .rst(rst),
 .W0R1(1'b0), 
 .pin_mosi(pin_mosi),
 .pin_sclk(pin_sclk),  
 .pin_miso(pin_miso), 
 .pin_csn(pin_csn),
 .wr(wr),  
 .busy(busy), 
 .addr(info24[  16+6 : 16 ] )  ,  
 .din(info24[15:0]),  
 .dout() 
);


endmodule 

最好仿真一下,写一下仿真测试文件:


module tb ;

reg clk=0,rst=0;
wire pin_mosi,pin_sclk,pin_miso,pin_csn,done ;
assign pin_miso =1'b1; 

always #5 clk = ~clk ;

initial begin 
rst = 1;
@(posedge clk);
@(posedge clk);
rst = 0;
end

initial begin

$dumpfile("vcd.vcd");
$dumpvars(0,tb);

end 

 lmx2594_master  lmx2594_master (
 .clk(clk),
 .rst(rst),
 .pin_mosi(pin_mosi),
 .pin_sclk(pin_sclk),
 .pin_miso(pin_miso),
 .pin_csn(pin_csn)
 .done(done)  
);

endmodule


========================================================================

下面的代码是顺便写的CDCM6208驱动:




module CDCM6208_spi_master (
input clk,rst,W0R1,
output reg  pin_mosi,pin_sclk,pin_csn,
input pin_miso,
input wr,
output busy,
input [15:0] addr ,
input [15:0] din,
output reg [15:0] dout 
);
 

reg [3:0] d ; always @ (posedge clk) if (rst) d<=0; else d<=d+1;

wire move = d == 0; 

reg [7:0] st ;
reg [23:0] reg32   ; always@(posedge clk)  if (wr&st==10) reg32 <= {addr[15:0],din[15:0]};
reg[23:0] result32;  always@(posedge clk)  if (st==200  ) dout <= result32[15:0] ;
reg  pin_miso_r ;    always@(posedge clk)   pin_miso_r<= pin_miso;
always@(posedge clk)   if (st==20)pin_csn<= 1'b0 ;else if ((st==202) ||(st==0)) pin_csn<= 1'b1 ;



always@(posedge clk)  if (rst) st<=0; else case(st)
0  :  begin  st <= 10 ; pin_mosi<=0;pin_sclk<=0;end  
10 : begin   pin_mosi<=0;pin_sclk<=0; if (  wr  ) st<=20  ;end  
20 :   if ( move ) st<=21  ;
21 :   if ( move ) st<=100 ; 

100: begin   pin_sclk<=0;      pin_mosi<=  reg32[31] ;  if (move) st<=st+1 ;    end 
101: begin   pin_sclk<=1;      pin_mosi<=  reg32[31] ;  result32[31] <= pin_miso_r;if (move) st<=st+1 ;    end 

102: begin   pin_sclk<=0;      pin_mosi<=  reg32[30] ;  if (move) st<=st+1 ;    end 
103: begin   pin_sclk<=1;      pin_mosi<=  reg32[30] ;  result32[30] <= pin_miso_r;if (move) st<=st+1 ;    end 

104: begin   pin_sclk<=0;      pin_mosi<=  reg32[29] ;  if (move) st<=st+1 ;    end 
105: begin   pin_sclk<=1;      pin_mosi<=  reg32[29] ;  result32[29] <= pin_miso_r;if (move) st<=st+1 ;    end 

106: begin   pin_sclk<=0;      pin_mosi<=  reg32[28] ;  if (move) st<=st+1 ;    end 
107: begin   pin_sclk<=1;      pin_mosi<=  reg32[28] ;  result32[28] <= pin_miso_r;if (move) st<=st+1 ;    end 

108: begin   pin_sclk<=0;      pin_mosi<=  reg32[27] ;  if (move) st<=st+1 ;    end 
109: begin   pin_sclk<=1;      pin_mosi<=  reg32[27] ;  result32[27] <= pin_miso_r;if (move) st<=st+1 ;    end 

110: begin   pin_sclk<=0;      pin_mosi<=  reg32[26] ;  if (move) st<=st+1 ;    end 
111: begin   pin_sclk<=1;      pin_mosi<=  reg32[26] ;  result32[26] <= pin_miso_r;if (move) st<=st+1 ;    end 

112: begin   pin_sclk<=0;      pin_mosi<=  reg32[25] ;  if (move) st<=st+1 ;    end 
113: begin   pin_sclk<=1;      pin_mosi<=  reg32[25] ;  result32[25] <= pin_miso_r;if (move) st<=st+1 ;    end 

114: begin   pin_sclk<=0;      pin_mosi<=  reg32[24] ;  if (move) st<=st+1 ;    end 
115: begin   pin_sclk<=1;      pin_mosi<=  reg32[24] ;  result32[24] <= pin_miso_r;if (move) st<=st+1 ;    end 

116: begin   pin_sclk<=0;      pin_mosi<=  reg32[23] ;  if (move) st<=st+1 ;    end 
117: begin   pin_sclk<=1;      pin_mosi<=  reg32[23] ;  result32[23] <= pin_miso_r;if (move) st<=st+1 ;    end 

118: begin   pin_sclk<=0;      pin_mosi<=  reg32[22] ;  if (move) st<=st+1 ;    end 
119: begin   pin_sclk<=1;      pin_mosi<=  reg32[22] ;  result32[22] <= pin_miso_r;if (move) st<=st+1 ;    end 

120: begin   pin_sclk<=0;      pin_mosi<=  reg32[21] ;  if (move) st<=st+1 ;    end 
121: begin   pin_sclk<=1;      pin_mosi<=  reg32[21] ;  result32[21] <= pin_miso_r;if (move) st<=st+1 ;    end 

122: begin   pin_sclk<=0;      pin_mosi<=  reg32[20] ;  if (move) st<=st+1 ;    end 
123: begin   pin_sclk<=1;      pin_mosi<=  reg32[20] ;  result32[20] <= pin_miso_r;if (move) st<=st+1 ;    end 

124: begin   pin_sclk<=0;      pin_mosi<=  reg32[19] ;  if (move) st<=st+1 ;    end 
125: begin   pin_sclk<=1;      pin_mosi<=  reg32[19] ;  result32[19] <= pin_miso_r;if (move) st<=st+1 ;    end 

126: begin   pin_sclk<=0;      pin_mosi<=  reg32[18] ;  if (move) st<=st+1 ;    end 
127: begin   pin_sclk<=1;      pin_mosi<=  reg32[18] ;  result32[18] <= pin_miso_r;if (move) st<=st+1 ;    end 

128: begin   pin_sclk<=0;      pin_mosi<=  reg32[17] ;  if (move) st<=st+1 ;    end 
129: begin   pin_sclk<=1;      pin_mosi<=  reg32[17] ;  result32[17] <= pin_miso_r;if (move) st<=st+1 ;    end 

130: begin   pin_sclk<=0;      pin_mosi<=  reg32[16] ;  if (move) st<=st+1 ;    end 
131: begin   pin_sclk<=1;      pin_mosi<=  reg32[16] ;  result32[16] <= pin_miso_r;if (move) st<=st+1 ;    end 

132: begin   pin_sclk<=0;      pin_mosi<=  reg32[15] ;  if (move) st<=st+1 ;    end 
133: begin   pin_sclk<=1;      pin_mosi<=  reg32[15] ;  result32[15] <= pin_miso_r;if (move) st<=st+1 ;    end 

134: begin   pin_sclk<=0;      pin_mosi<=  reg32[14] ;  if (move) st<=st+1 ;    end 
135: begin   pin_sclk<=1;      pin_mosi<=  reg32[14] ;  result32[14] <= pin_miso_r;if (move) st<=st+1 ;    end 

136: begin   pin_sclk<=0;      pin_mosi<=  reg32[13] ;  if (move) st<=st+1 ;    end 
137: begin   pin_sclk<=1;      pin_mosi<=  reg32[13] ;  result32[13] <= pin_miso_r;if (move) st<=st+1 ;    end 

138: begin   pin_sclk<=0;      pin_mosi<=  reg32[12] ;  if (move) st<=st+1 ;    end 
139: begin   pin_sclk<=1;      pin_mosi<=  reg32[12] ;  result32[12] <= pin_miso_r;if (move) st<=st+1 ;    end 

140: begin   pin_sclk<=0;      pin_mosi<=  reg32[11] ;  if (move) st<=st+1 ;    end 
141: begin   pin_sclk<=1;      pin_mosi<=  reg32[11] ;  result32[11] <= pin_miso_r;if (move) st<=st+1 ;    end 

142: begin   pin_sclk<=0;      pin_mosi<=  reg32[10] ;  if (move) st<=st+1 ;    end 
143: begin   pin_sclk<=1;      pin_mosi<=  reg32[10] ;  result32[10] <= pin_miso_r;if (move) st<=st+1 ;    end 

144: begin   pin_sclk<=0;      pin_mosi<=  reg32[9] ;  if (move) st<=st+1 ;    end 
145: begin   pin_sclk<=1;      pin_mosi<=  reg32[9] ;  result32[9] <= pin_miso_r;if (move) st<=st+1 ;    end 

146: begin   pin_sclk<=0;      pin_mosi<=  reg32[8] ;  if (move) st<=st+1 ;    end 
147: begin   pin_sclk<=1;      pin_mosi<=  reg32[8] ;  result32[8] <= pin_miso_r;if (move) st<=st+1 ;    end 

148: begin   pin_sclk<=0;      pin_mosi<=  reg32[7] ;  if (move) st<=st+1 ;    end 
149: begin   pin_sclk<=1;      pin_mosi<=  reg32[7] ;  result32[7] <= pin_miso_r;if (move) st<=st+1 ;    end 

150: begin   pin_sclk<=0;      pin_mosi<=  reg32[6] ;  if (move) st<=st+1 ;    end 
151: begin   pin_sclk<=1;      pin_mosi<=  reg32[6] ;  result32[6] <= pin_miso_r;if (move) st<=st+1 ;    end 

152: begin   pin_sclk<=0;      pin_mosi<=  reg32[5] ;  if (move) st<=st+1 ;    end 
153: begin   pin_sclk<=1;      pin_mosi<=  reg32[5] ;  result32[5] <= pin_miso_r;if (move) st<=st+1 ;    end 

154: begin   pin_sclk<=0;      pin_mosi<=  reg32[4] ;  if (move) st<=st+1 ;    end 
155: begin   pin_sclk<=1;      pin_mosi<=  reg32[4] ;  result32[4] <= pin_miso_r;if (move) st<=st+1 ;    end 

156: begin   pin_sclk<=0;      pin_mosi<=  reg32[3] ;  if (move) st<=st+1 ;    end 
157: begin   pin_sclk<=1;      pin_mosi<=  reg32[3] ;  result32[3] <= pin_miso_r;if (move) st<=st+1 ;    end 

158: begin   pin_sclk<=0;      pin_mosi<=  reg32[2] ;  if (move) st<=st+1 ;    end 
159: begin   pin_sclk<=1;      pin_mosi<=  reg32[2] ;  result32[2] <= pin_miso_r;if (move) st<=st+1 ;    end 

160: begin   pin_sclk<=0;      pin_mosi<=  reg32[1] ;  if (move) st<=st+1 ;    end 
161: begin   pin_sclk<=1;      pin_mosi<=  reg32[1] ;  result32[1] <= pin_miso_r;if (move) st<=st+1 ;    end 

162: begin   pin_sclk<=0;      pin_mosi<=  reg32[0] ;  if (move) st<=st+1 ;    end 
163: begin   pin_sclk<=1;      pin_mosi<=  reg32[0] ;  result32[0] <= pin_miso_r;if (move) st<=200 ;    end 



200: begin   pin_sclk<=0; if (move)  st<=st+1;end 
201: begin   pin_sclk<=0; if (move)  st<=st+1;end 
202: begin   pin_sclk<=0; if (move)  st<=st+1;end 
203: begin                if (move)  st<=10; end
default st<=0;
endcase

assign busy = (wr==1) || (st!=10) ;

endmodule 

下面是顺便写的lmx2582的驱动。




/*

 lmx2582_spi_master lmx2582_spi_master (
 .clk() ,
 .rst(),
 .W0R1(), 
 .pin_mosi(),
 .pin_sclk(),  
 .pin_miso(), 
 .wr(),  
 .busy(), 
 .addr() ,  
 .din(),  
 .dout() 
);
 
*/


module lmx2582_spi_master (
input clk,rst,W0R1,
output reg  pin_mosi,pin_sclk,pin_csn,
input pin_miso,
input wr,
output busy,
input [6:0] addr ,
input [15:0] din,
output reg [15:0] dout 
);
 

reg [3:0] d ; always @ (posedge clk) if (rst) d<=0; else d<=d+1;

wire move = d == 0; 

reg [7:0] st ;
reg [23:0] reg24   ; always@(posedge clk)  if (wr&st==10) reg24 <= {W0R1,addr[6:0],din[15:0]};
reg[23:0] result24;  always@(posedge clk)  if (st==148  ) dout <= result24[15:0] ;
reg  pin_miso_r ;    always@(posedge clk)   pin_miso_r<= pin_miso;
always@(posedge clk)   if (st==20)pin_csn<= 1'b0 ;else if ((st==149) ||(st==0)) pin_csn<= 1'b1 ;



always@(posedge clk)  if (rst) st<=0; else case(st)

0  :  begin  st <= 10 ; pin_mosi<=0;pin_sclk<=0;end  

10 : begin   pin_mosi<=0;pin_sclk<=0; if (  wr  ) st<=20  ;end  
20 :   if ( move ) st<=21  ;
21 :   if ( move ) st<=100 ; 
/*
main(){
int i ,j;for(i=j=0;i<24*2;){
printf("%d: begin   pin_sclk<=0;      pin_mosi<=  reg24[%d] ;  if (move) st<=st+1 ;    end \n",100+i,(23-j));++i;
printf("%d: begin   pin_sclk<=1;      pin_mosi<=  reg24[%d] ;  result24[%d] <= pin_miso_r;if (move) st<=st+1 ;    end \n\n",100+i,(23-j),(23-j)); j++; ++i;
}}
*/
100: begin   pin_sclk<=0;      pin_mosi<=  reg24[23] ;  if (move) st<=st+1 ;    end 
101: begin   pin_sclk<=1;      pin_mosi<=  reg24[23] ;  result24[23] <= pin_miso_r;if (move) st<=st+1 ;    end 

102: begin   pin_sclk<=0;      pin_mosi<=  reg24[22] ;  if (move) st<=st+1 ;    end 
103: begin   pin_sclk<=1;      pin_mosi<=  reg24[22] ;  result24[22] <= pin_miso_r;if (move) st<=st+1 ;    end 

104: begin   pin_sclk<=0;      pin_mosi<=  reg24[21] ;  if (move) st<=st+1 ;    end 
105: begin   pin_sclk<=1;      pin_mosi<=  reg24[21] ;  result24[21] <= pin_miso_r;if (move) st<=st+1 ;    end 

106: begin   pin_sclk<=0;      pin_mosi<=  reg24[20] ;  if (move) st<=st+1 ;    end 
107: begin   pin_sclk<=1;      pin_mosi<=  reg24[20] ;  result24[20] <= pin_miso_r;if (move) st<=st+1 ;    end 

108: begin   pin_sclk<=0;      pin_mosi<=  reg24[19] ;  if (move) st<=st+1 ;    end 
109: begin   pin_sclk<=1;      pin_mosi<=  reg24[19] ;  result24[19] <= pin_miso_r;if (move) st<=st+1 ;    end 

110: begin   pin_sclk<=0;      pin_mosi<=  reg24[18] ;  if (move) st<=st+1 ;    end 
111: begin   pin_sclk<=1;      pin_mosi<=  reg24[18] ;  result24[18] <= pin_miso_r;if (move) st<=st+1 ;    end 

112: begin   pin_sclk<=0;      pin_mosi<=  reg24[17] ;  if (move) st<=st+1 ;    end 
113: begin   pin_sclk<=1;      pin_mosi<=  reg24[17] ;  result24[17] <= pin_miso_r;if (move) st<=st+1 ;    end 

114: begin   pin_sclk<=0;      pin_mosi<=  reg24[16] ;  if (move) st<=st+1 ;    end 
115: begin   pin_sclk<=1;      pin_mosi<=  reg24[16] ;  result24[16] <= pin_miso_r;if (move) st<=st+1 ;    end 

116: begin   pin_sclk<=0;      pin_mosi<=  reg24[15] ;  if (move) st<=st+1 ;    end 
117: begin   pin_sclk<=1;      pin_mosi<=  reg24[15] ;  result24[15] <= pin_miso_r;if (move) st<=st+1 ;    end 

118: begin   pin_sclk<=0;      pin_mosi<=  reg24[14] ;  if (move) st<=st+1 ;    end 
119: begin   pin_sclk<=1;      pin_mosi<=  reg24[14] ;  result24[14] <= pin_miso_r;if (move) st<=st+1 ;    end 

120: begin   pin_sclk<=0;      pin_mosi<=  reg24[13] ;  if (move) st<=st+1 ;    end 
121: begin   pin_sclk<=1;      pin_mosi<=  reg24[13] ;  result24[13] <= pin_miso_r;if (move) st<=st+1 ;    end 

122: begin   pin_sclk<=0;      pin_mosi<=  reg24[12] ;  if (move) st<=st+1 ;    end 
123: begin   pin_sclk<=1;      pin_mosi<=  reg24[12] ;  result24[12] <= pin_miso_r;if (move) st<=st+1 ;    end 

124: begin   pin_sclk<=0;      pin_mosi<=  reg24[11] ;  if (move) st<=st+1 ;    end 
125: begin   pin_sclk<=1;      pin_mosi<=  reg24[11] ;  result24[11] <= pin_miso_r;if (move) st<=st+1 ;    end 

126: begin   pin_sclk<=0;      pin_mosi<=  reg24[10] ;  if (move) st<=st+1 ;    end 
127: begin   pin_sclk<=1;      pin_mosi<=  reg24[10] ;  result24[10] <= pin_miso_r;if (move) st<=st+1 ;    end 

128: begin   pin_sclk<=0;      pin_mosi<=  reg24[9] ;  if (move) st<=st+1 ;    end 
129: begin   pin_sclk<=1;      pin_mosi<=  reg24[9] ;  result24[9] <= pin_miso_r;if (move) st<=st+1 ;    end 

130: begin   pin_sclk<=0;      pin_mosi<=  reg24[8] ;  if (move) st<=st+1 ;    end 
131: begin   pin_sclk<=1;      pin_mosi<=  reg24[8] ;  result24[8] <= pin_miso_r;if (move) st<=st+1 ;    end 

132: begin   pin_sclk<=0;      pin_mosi<=  reg24[7] ;  if (move) st<=st+1 ;    end 
133: begin   pin_sclk<=1;      pin_mosi<=  reg24[7] ;  result24[7] <= pin_miso_r;if (move) st<=st+1 ;    end 

134: begin   pin_sclk<=0;      pin_mosi<=  reg24[6] ;  if (move) st<=st+1 ;    end 
135: begin   pin_sclk<=1;      pin_mosi<=  reg24[6] ;  result24[6] <= pin_miso_r;if (move) st<=st+1 ;    end 

136: begin   pin_sclk<=0;      pin_mosi<=  reg24[5] ;  if (move) st<=st+1 ;    end 
137: begin   pin_sclk<=1;      pin_mosi<=  reg24[5] ;  result24[5] <= pin_miso_r;if (move) st<=st+1 ;    end 

138: begin   pin_sclk<=0;      pin_mosi<=  reg24[4] ;  if (move) st<=st+1 ;    end 
139: begin   pin_sclk<=1;      pin_mosi<=  reg24[4] ;  result24[4] <= pin_miso_r;if (move) st<=st+1 ;    end 

140: begin   pin_sclk<=0;      pin_mosi<=  reg24[3] ;  if (move) st<=st+1 ;    end 
141: begin   pin_sclk<=1;      pin_mosi<=  reg24[3] ;  result24[3] <= pin_miso_r;if (move) st<=st+1 ;    end 

142: begin   pin_sclk<=0;      pin_mosi<=  reg24[2] ;  if (move) st<=st+1 ;    end 
143: begin   pin_sclk<=1;      pin_mosi<=  reg24[2] ;  result24[2] <= pin_miso_r;if (move) st<=st+1 ;    end 

144: begin   pin_sclk<=0;      pin_mosi<=  reg24[1] ;  if (move) st<=st+1 ;    end 
145: begin   pin_sclk<=1;      pin_mosi<=  reg24[1] ;  result24[1] <= pin_miso_r;if (move) st<=st+1 ;    end 

146: begin   pin_sclk<=0;      pin_mosi<=  reg24[0] ;  if (move) st<=st+1 ;    end 
147: begin   pin_sclk<=1;      pin_mosi<=  reg24[0] ;  result24[0] <= pin_miso_r;if (move) st<=st+1 ;    end 

148: begin   pin_sclk<=0; if (move)  st<=st+1;end 
149: begin   pin_sclk<=0; if (move)  st<=st+1;end 
150: begin   pin_sclk<=0; if (move)  st<=st+1;end 
151: begin                if (move)  st<=10; end
default st<=0;
endcase

assign busy = (wr==1) || (st!=10) ;

endmodule 


都是一个套路生成的代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lmx2594的verilog驱动 的相关文章

  • 大端小端,LSB和MSB

    在verilog中碰到了lsb和msb 所以做一下解释 lsb 就是最低位有效 类似于wire 0 31 这样的顺序 msb 就是最高位有效 类似于wire 31 0 这样的顺序 还有计算机中还有大端小端的概念一块解释一下 举例 0X123
  • 错误:“(vlog-2110) 非法引用网络”

    我在 SystemVerilog 中有一个简单的 FIFO 代码 我得到几个vlog 2110 illegal reference to net错误消息 我的错误消息后面是我的代码 错误信息 vlog work 工作 sv stats no
  • 如何在 Verilog 中将长语句分成行

    例如 我有一个很长的声明 display input data x output data x result x input data output data result 如何在 Verilog 中将其变成单语句和多行 您需要分解引用的字
  • 为什么我的输出没有被赋值?

    我正在为一个更大项目的一部分开发解码器 我有两个计数器充当该模块的输入 其中一个计数器计数 0 15 另一个计数器在第一个计数器达到 15 时递增一次 根据计数器的值 解码器输出不同的值 通常它是 0 1 或 1 但有时它必须是 0 707
  • Verilog 位更改位置

    假设我有一个寄存器reg 15 0 my reg 其中包含一个16位signed sample 如何找到第一位变化的位置 意思是 如果假设my reg 16 b0001011011010111 我怎么知道第一个变化是0 to 1 is at
  • Quartus Prime 中的“多个常量驱动程序”Verilog 错误

    我正在致力于用 Verilog 设计一个有限状态机来表示堆栈 该模块如下 module state machine s Enable Clock Resetn c OF Err UF Err input 2 0 s input Enable
  • 计算数组中的个数

    我试图在 Verilog 中计算 4 位二进制数中 1 的数量 但我的输出是意外的 我尝试了几种方法 这是我认为应该有效的方法 但事实并非如此 module ones one in input 3 0 in output 1 0 one a
  • 如何使用触发器输出作为复位信号的输入

    我在柜台里放了 3D 触发器 一旦达到 5 101 我想将 FF 复位输入设置为高 使用或门 复位为低电平有效 这几乎可以工作 但是 当我最初运行程序时 触发器的 Q 输出都是未知的 因此 最初 或门的复位输入为低电平 但是 因为一开始 Q
  • 如何使用 Verilog 宏模拟 $display?

    我想创建一个具有多个参数的宏 就像 display 一样 我的代码看起来像这样 但它不起作用 define format macro A write s sformatf A 这就是我调用 format macro 的方式 format m
  • Verilog 中总是后面跟着 #(...) pound 是什么意思?

    在一个简单的时钟生成器示例中 我看到以下代码 always cycle 2 clk clk 我以前总是见过 但没见过井号 我试图在文档中找到它 但我所能找到的只是一些对 实值端口 的引用 没有进一步的阐述 这是一个延迟操作 它本质上只是读取
  • 使用forever和always语句

    以下两个代码都会生成一个时钟 我需要知道除了时钟生成之外 永远循环是否还有其他用途 我只在时钟一代中遇到过永远 如果只是为了这个目的 那岂不是毫无用处 initial begin clk 0 forever begin 5 clk clk
  • 如何生成异步复位verilog总是阻塞凿子

    Chisel 始终生成敏感度列表中仅包含时钟的块 always posedge clk begin end 是否可以将模块配置为使用异步重置并生成这样的始终块 always posedge clk or posedge reset begi
  • Verilog 最佳实践 - 递增变量

    我绝不是 Verilog 专家 我想知道是否有人知道这些增加值的方法中哪一种更好 抱歉 如果这个问题太简单了 Way A 在组合逻辑块中 可能在状态机中 some condition count next count 1 然后在一个连续块中
  • 在verilog中将wire值转换为整数

    我想将电线中的数据转换为整数 例如 wire 2 0 w 3 b101 我想要一个将其转换为 5 并将其存储在整数中的方法 我怎样才能以比这更好的方式做到这一点 j 1 for i 0 i lt 2 i i 1 begin a a w i
  • Verilog 中的“net”代表什么?

    我刚刚开始学习Verilog 据我了解 Verilog有net数据类型 什么是net代表 网络就是这样一种数据类型 您不使用它来存储值 它们代表物理连接 您可以将线路视为一种网络数据类型 你可以去网上看看更多here http www ee
  • FPGA大输入数据

    我正在尝试向 FPGA 发送 4 KB 字符串 最简单的方法是什么 是我正在使用的fpga的链接 我正在使用 Verilog 和 Quartus 您的问题的答案在很大程度上取决于将数据输入 FPGA 的内容 即使没有您需要遵守的特定协议 S
  • 开始后跟冒号和变量是什么意思?

    什么是data mux意思是这里 它只是块的名称吗 if PORT CONFIG 32 P0 1 b1 begin data mux end 这些是块名称 它们特别适用于generate块 例如 您可以定义一个generate块如 genv
  • Verilog 中的大括号是什么意思?

    我很难理解 Verilog 中的以下语法 input 15 0 a 16 bit input output 31 0 result 32 bit output assign result 16 a 15 a 15 0 我知道assign语句
  • 如何在 Verilog 中推断 Block RAM

    我在一个项目中遇到了一个非常具体的问题 这个问题已经困扰我好几天了 我有以下 RAM 模块的 Verilog 代码 module RAM param clk addr read write clear data in data out pa
  • 系统 verilog 中没有类型的输入

    我在一个系统 verilog 代码的输入和输出的示例中遇到过module没有说明它们的类型 例如logic wire module mat to stream input 2 0 2 0 2 0 a b input newdata inpu

随机推荐

  • Deep Compression阅读理解及Caffe源码修改

    更新 xff1a 没想到这篇文章写出后有这么多人关注和索要源码 xff0c 有点受宠若惊 说来惭愧 xff0c 这个工作当时做的很粗糙 xff0c 源码修改的比较乱 xff0c 所以一直不太好拿出手 最近终于有时间整理了一下代码并开源出来了
  • Tensorflow 离线安装跳坑总结

    TensorFlow作为目前最被看好的深度学习开源框架 xff0c 又顶着Google爸爸的光环 xff0c 使得很多CNN网络的部署都基于此框架 最近开始研究GAN xff08 生成对抗网络 xff09 xff0c 鉴于大部分源码都基于T
  • ARM NEON常用函数总结

    NEON 技术是 ARM Cortex A 系列处理器的 128 位 SIMD xff08 单指令 xff0c 多数据 xff09 架构扩展 xff0c 旨在为消费性多媒体应用程序提供灵活 强大的加速功能 xff0c 从而显著改善用户体验
  • TensorRT cuda8.0 cudnn 7.0.5 tar包安装

    总体步骤参考这篇文章 https zhuanlan zhihu com p 35468450 1 准备环境 TensorRT 依赖cuda和cudnn xff0c 且根据下载的TensorRT版本 xff0c 需要严格保证cuda和cudn
  • caffe模型TensorRT部署实践(一)

    参考代码 TensorRT安装包下的samples sampleMNIST sampleMNIST cpp 1 设置使用的gpu id xff0c 如果不设置 xff0c 默认使用第0块 cudaSetDevice 3 set device
  • Ubuntu关于串口的操作(查看串口信息、串口助手、串口权限)

    一 查看本机串口信息 1 串口是否在使用 串口在 dev 目录中 xff0c 查看串口是否在使用 xff0c 可以用命令 ls l dev ttyUSB0 说明 xff1a ls l xff1a 是查看目录的命令 xff0c 直接用ls或l
  • 基于caffe的量化模型训练与部署——训练篇

    为什么需要量化 xff1f 我们知道 xff0c cnn网络的前向计算瓶颈主要集中在卷积层 xff0c 而卷积层的实质是大量的浮点数相乘 相加等运算操作 xff0c 大量的浮点数计算限制了模型在低处理器或移动端等设备中的部署 如果能将浮点运
  • get/post简单请求示例

    安装了django后使用django admin startproject demoapi创建django项目 xff0c cd demopai进入项目目录内 xff0c 创建apppython manage py startapp api
  • 什么是请求报文和响应报文?

    在了解请求报文和响应报文之前 咱们先了解下什么是HTTP协议 http协议 网络传输协议 协议 规定网络数据传输格式 http协议组成 请求报文 43 响应报文 浏览器发请求 必须是 xff1a 请求报文 服务器响应 必须是 xff1a 响
  • std::vector

    文章目录 问题处理记录std vector查找指定元素C 43 43 概念优点缺点使用 vector声明和初始化vector的基本操作二维向量vector的begin end 和 front back 的区别示例应用场景 C 43 43 中
  • 4、认识一下堆和栈

    文章目录 一 前言二 程序的内存分配方式 一 前言 因为FreeRTOS对堆和栈的理解很重要 xff0c 所以学习Freertos xff0c 先简单了解一下内存的存储方式 xff0c 堆和栈是最重要的们主要是那个返回地址 xff01 xf
  • TCP/IP详解

    前言 精通 TCP IP xff0c 熟练使用 Socket 进行网路编程 看到这句话 xff0c 有没有感到很熟悉呀 xff1f 相信很多人在投递简历的时候都看到过这条要求 xff0c 很多人会觉得我们在实际开发中一般用不到这些知识 xf
  • C语言 epoll实现IO多路复用

    友链 gcc 1 c o 1 lpthread ctrl 43 f搜索服务端代码和客户端代码获取代码 该方法也可以实现并发服务器 服务端代码 span class token comment 使用内存映射可以拷贝文件 span span c
  • 1.2 struct和class最本质区别_马鸿凯_新浪博客

    C 43 43 中的struct对C中的struct进行了扩充 xff0c 它已经不再只是一个包含不同数据类型的数据结构了 xff0c 它已经获取了太多的功能 struct能包含成员函数吗 xff1f 能 xff01 struct能继承吗
  • 在 VSCode 终端里无法使用命令

    问题原因 xff1a 导致 vscode 的终端里执行命令报错 xff0c 但在 cmd 里能正常执行 的原因是 vscode 终端不能使用命令了 解决思路 xff1a 令 vscode 终端能够使用命令 解决方案 xff1a 1 右击 V
  • 使用 FFT 进行频谱分析

    下面的示例说明了如何使用 FFT 函数进行频谱分析 FFT 的一个常用场景是确定一个时域噪声信号的频率分量 首先创建一些数据 假设是以 1000 Hz 的频率对数据进行的采样 首先为数据构造一条时间轴 xff0c 时间范围从 t 61 0
  • CRC-16 / MODBUS 校验计算方法

    CRC 16 MODBUS xff1a 1 xff09 CRC寄存器初始值为 FFFF xff1b 即16个字节全为1 xff1b 2 xff09 CRC 16 MODBUS的多项式A001H 1010 0000 0000 0001B H
  • ZYNQ下驱动ADF5355试验成功

    前两个集BLOG分别给出了ADF5355接口的VERILOG设计实现以及设置频率的C语言算法 xff0c 我今天试验了以 xff0c 试验成功了 首先很重要的是ADF5355寄存器配置的设置 xff1a 可以在这个基础上修改输入以及输入频率
  • 基于sdrpi的openwifi实践1:编译openwifi-hw

    www github com open sdr openwifi hw是openwifi的硬件项目 hw应该就取haraware之意思 xff0c 包含就是支持多个板子的项目以及openwifi作者写的一系列的简洁好用工具软件 我在做sdr
  • lmx2594的verilog驱动

    应朋友请求写了一个纯VERILOG的LMX2594的配置 首先写一个SPI的接口 xff1a lmx2594 spi master lmx2594 spi master clk rst W0R1 pin mosi pin sclk pin