verilog 中 数据发送的描述和应用!, 本人的实战代码~
这是本人用FPGA做RS232发送的代码一部分:
目的是想将一下数据发送的verilog代码怎么样描述比较贴近底层
和高效率的运行,虽然没有用上经典FPGA原则:(乒乓操作,PIPLING)
但是有一定的借鉴作用:
一般的RS232的通信是9600bps 10 bit ——1 bit begin ,1 bit end ,and
8bit data ;
if we use 11.0592MHZ(便于和51单片机通信)
我们将分频 11.0592M/9600=1152
分频部分省略:
这里只说主要参数和设计原则,
output out;
reg start_flag; // start_flag
reg [7:0] uart_buf; // send buffer;
reg txd_reg ;// txd register;
reg [3:0] bit_count // bit which send counter
always@(posedge clock) //clock 为分频后的时钟!
begin
if(start_flag||bit_count<4'd10)//因为我们要保证发送的数据只有10位
bit_count=bit_count+1;//而且如果没有发送完要继续发送
else bit_count=0; //如果要加入可调 波特率,可以自己设计
case(bit_count)
4'h0:txd_reg= 0;
4'h1:txd_reg= uart_buf[0]
4'h2:txd_reg= uart_buf[1];
4'h3:txd_reg= uart_buf[2];
4'h4:txd_reg= uart_buf[3];
4'h5:txd_reg= uart_buf[4]
4'h6:txd_reg= uart_buf[5];
4'h7:txd_reg= uart_buf[6];
4'h8:txd_reg= uart_buf[7];
4'h9:txd_reg= 1;
default: txd_reg=1;
endcase
end
assign out="txd"_reg;
好了,这是代码,我来说一下设计思想,
对于要用到数据传输的系统中,这种设计思想是必备的;
比如有串数据在buffer[20]中,用C语言来写
可能是这样的:
for(i=0;i<20;i++)
send=buffer;
但是这种写法在硬件描述语言中虽然是正确的但不符合
做FPGA的原则:面积与速度;这段代码在这两个方面上
都没有符合要求;
所以
我们要有一个硬件的设计思想
就是设计一个计数器COUNTER这个计数器,的个数是你要发送的数据个数
也可以设计成可调的,
然后用CASE。。。。。ENDCASE语句来扑捉这个COUNTER
对于不同COUNTER 发送不同的数据位,输出可以是并行的也可以是串行的!
如果加上乒乓操作,数据传输的将更快,再加上IP复用面积就更小了!
好了,本人愚作,谢谢欣赏!
用户133301 2008-3-15 18:55