新手入门
- 积分
- 6
- 金钱
- 6
- 注册时间
- 2022-8-14
- 在线时间
- 1 小时
|
1金钱
第十六章 UART 串口通信实验 代码文件 uart_recv.v 中一段代码:
//根据接收数据计数器来寄存uart接收端口数据
always @(posedge sys_clk or negedge sys_rst_n) begin
if ( !sys_rst_n)
rxdata <= 8'd0;
else if(rx_flag) //系统处于接收过程
if (clk_cnt == BPS_CNT/2) begin //判断系统时钟计数器计数到数据位中间
case ( rx_cnt )
4'd1 : rxdata[0] <= uart_rxd_d1; //寄存数据位最低位
4'd2 : rxdata[1] <= uart_rxd_d1;
4'd3 : rxdata[2] <= uart_rxd_d1;
4'd4 : rxdata[3] <= uart_rxd_d1;
4'd5 : rxdata[4] <= uart_rxd_d1;
4'd6 : rxdata[5] <= uart_rxd_d1;
4'd7 : rxdata[6] <= uart_rxd_d1;
4'd8 : rxdata[7] <= uart_rxd_d1; //寄存数据位最高位
default:;
endcase
end
else //没有这句程序就不能正常工作
rxdata <= rxdata; //没有这句程序就不能正常工作
else
rxdata <= 8'd0;
end
问题:
如果注释掉 rxdata <= rxdata; 程序就不能正常工作,为什么呢?
不是说“只有不带时钟的 always 语句的 if 或者 case 语句不完整才会产生 latch,带时钟的语句 if 或者 case 语句不完整描述不会产生 latch”---《正点原子逻辑设计指南 V1.9.pdf》48页
看了修改后生成的电路确实没有产生latch,而且也没有看到2种代码生成的电路有什么明显不同,为何结果不同呢?
作为一个新手看到程序似乎都会这么写,一定要对if-else补全,我理解的补全就是为了不产生latch,那样修改也没有产生latch但是结果确是错误的。
|
|