Verilog实现RS232 RTL时的相关代码是否合法可综合?
Verilog代码合法性及问题排查结论
合法性判定
你提供的代码片段语法合法,可正常生成可综合电路,观测到dataframe_tx恒为0的问题与语法合法性无关,属于逻辑设计错误。
常见问题根因
- 赋值类型与顺序错误:如果这段代码写在时钟沿触发的时序逻辑块中(敏感列表包含
@(posedge clk)),你使用的阻塞赋值=会导致值立即更新,打乱逻辑时序:
初始count_tx为12时,第一次进入状态首先取temp_tx[12-12] = temp_tx[0],随后count_tx立即被修改为11,再判断状态跳转条件。如果你的发送逻辑是高位先发,索引顺序完全反转,刚好对应位全为0就会出现你观测到的现象。 - 索引越界问题:如果
temp_tx的位宽为12位(索引范围0~11),当count_tx递减到0时,12-count_tx=12会触发索引越界,Verilog标准中索引越界访问的返回值为0,也会导致输出恒为0。 temp_tx赋值时机错误:如果temp_tx是在进入S_SENDING状态后才被赋值,第一个周期读取到的就是temp_tx的初始值(默认为0),如果后续逻辑也没有正确加载待发送数据,就会全程输出0。
修复示例
推荐时序逻辑统一使用非阻塞赋值<=,调整计数逻辑的执行顺序,避免赋值顺序带来的时序问题:
S_SENDING: begin dataframe_tx <= temp_tx[12 - count_tx]; if(count_tx == 1'd1) begin next_tx <= S_DONE; done_tx <= 1'b1; count_tx <= 12'd12; // 计数复位,为下一次发送做准备 end else begin next_tx <= S_SENDING; count_tx <= count_tx - 1'd1; end end
内容的提问来源于stack exchange,提问作者SWETHA CHILVERI
相关产品推荐
相关产品推荐

