|
我的FPGA需要实现如下功能:接收一个两字节的命令,如:16'h8003,8位字节接收,然后解析,我的实现如下,
1)一共三个模块,顶层模块uart_top();
2)子模块uart_ctrl( )实现串口接收数据并存入一个16字节的lpm缓冲区;
首先接收到串口数据,
... ...
然后 实现串口接收数据并存入下面的fifo
uart_r_fifo uart_r_fifo(
//存入
.data(rx_data),
.wrclk(clk_25m),
.wrreq(uart_int_rcv),
//读取
.rdclk(clk_1m),//---------------------------------------------------------------------
.rdreq(rd_cmd_sig),//----------------------------------------------
.q(q), //---------------------------------------------------------------------
// 状态指示 //----------------
.wrempty(),
.wrfull(),
.wrusedw(),
.rdempty(rdempty),
.rdfull(),
.rdusedw(),
.aclr()
);
assign cmd_in_sig =~rdempty;
2)从缓冲区内读出数据;
reg [7:0] command2
module uart_decoder()
always @(posedge clk_1m or posedge cmd_in_sig)
if(cmd_in_sig)
begin
test_sig2_r <=1'b1;
rd_cmd_sig_r <=1'b1;
command2 <= command;
end
else
begin
rd_cmd_sig_r <=1'b0;
test_sig2_r <=1'b0;
if(command2 == 8'h80)
test_sig1_r <=1'b1;
end
endmodule
3)现在经过察看示波器,当接收到数据的时候,test_sig2_r 是一个2us的方波,test_sig1_r 信号不变,即:不能判断已经收到8'h80
如何实现这个过程比较好?
其中 cmd_in_sig 是dcfifo 读空标志的取反,只要fifo不空,该信号就会为1,就去置位rd_cmd_sig_r ,而读取fifo,这里是不是做的不好?
直接使用 cmd_in_sig来置位 rd_cmd_sig_r 是不是有点问题?两个信号之间是不是有点互锁的意思?
想实现 cmd_in_sig来个上升沿,然后在1m时钟下驱动计数,然后在1m时钟的一个周期置位rd_cmd_sig_r,去读fifo,如何实现好? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|