变量(reg)未初始化的笔记

变量(reg)在全局reset时未初始化,

工作之后终于知道有专门一个名词叫作x propagation

仿真和实际上板跑有一个区别是仿真时未初始化的变量在波形里是红色的x,实际上板跑的时候是不会有这种信号。导致上板结果和仿真不一致。

在实际调试时发现未初始化的变量在全局reset时并不一定是低电平的0,原因是程序中很多代码不依赖reset就已经开始跑了,

最简单的例子

always @ (posedge clk)

a <= b;

在未reset之前,a就依赖b而动了,在reset时a可能不是低电平的0了。

有些状态机在未reset时就已经往下跑了,开始状态迁移了,所以最好的设计是在reset之前状态机保持不动。

if (a==30)

c <=1;

else

c <= 0;

if(a!=30)

c <= 1;

else

    c <= 0;

如果a是x,这两个判断都走else分支,c结果都是0


`timescale 1ns / 1ns // timescale time_unit/time_presicion





module bitstream_tb;

reg rst;

reg dec_clk;





initial begin

    rst = 0;

    #50 rst = 1;

    #1 rst = 0;



end



always

begin

    #1 dec_clk = 0;

    #1 dec_clk = 1;

end





reg signed [7:0] a;

wire signed [7:0] b;

reg c;



always @ (posedge dec_clk) begin

    if (a==8'h30)

        c  <= 1;

    else

        c  <= 0;

end





endmodule

vivado PostSynthesis仿真时,结果有点不一样,100ns之前c是0,之后就是X了

 c <= a?1:0 这样,问号代替if,结果a为x,c也为x

Conditional Operator ?:

 Operates like the C statement I conditional expression ? true expression : false expression ;

 The conditional expression is first evaluated

 If the result is true, true expression is evaluated

 If the result is false, false expression is evaluated

 If the result is x:

 both true and false expressions are evaluated,...

 their results compared bit by bit,...

 returns a value of x if bits differ, OR...

 the value of the bits if they are the same.

This is an ideal way to model a multiplexer or tri-state buffer.


`timescale 1ns / 1ns // timescale time_unit/time_presicion





module bitstream_tb;

reg rst;

reg dec_clk;





initial begin

    rst = 0;

    #50 rst = 1;

    #1 rst = 0;



end



always

begin

    #1 dec_clk = 0;

    #1 dec_clk = 1;

end





reg  [7:0] a;

reg b;

reg c;



always @ (posedge dec_clk) begin

    c <= a?1:0;

end





endmodule

### 关于蓝桥杯竞赛中的嵌入式学习笔记 #### IIC程序设计 在蓝桥杯嵌入式比赛中,IIC协议的应用是一个重要的考点。比赛重点在于利用IIC原理来操作24C02存储器以及MCP4017可编程电阻的读写功能[^1]。 ```c // 初始化I2C总线并设置参数 void I2C_Init(void){ // 配置代码... } // 向指定地址写入数据 void Write_IIC(uint8_t device_addr, uint8_t reg_addr, uint8_t data){ // 写入逻辑... } ``` #### PWM信号生成 对于PWM模块的学习,掌握如何配置定时器以产生特定频率和占空比的PWM波形至关重要。具体来说,可以通过调整`TIMx_ARR`寄存器设定周期(即频率),并通过修改`TIMx_CCRx`寄存器控制脉冲宽度(即占空比)。这使得能够灵活地创建同特性的PWM输出信号[^2]。 ```c // 设置PWM通道的具体参数 void Set_PWM_Channel(TIM_HandleTypeDef* htim, uint32_t channel, float duty_cycle){ __HAL_TIM_SET_COMPARE(htim, channel, (uint32_t)(duty_cycle * (__HAL_TIM_GET_AUTORELOAD(htim)))); } ``` #### 串口通信实现 为了处理串口的数据传输,在实际项目中通常会定义缓冲数组用于暂存收发的信息,并通过中断服务例程完成异步接收任务。下面展示了基于STM32 HAL库的一个简单例子,其中包含了初始化、发送函数及自定义的UART接收回调函数[^3]。 ```c u8 huart1_buf[30]; // 接收缓存区大小设为30字节 u8 _huart1_buf; // 单字符临时变量 u8 huart1_buf_num = 0; // 当前位置指针 // UART接收完成后触发此函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance==USART1){ huart1_buf[huart1_buf_num++ % sizeof(huart1_buf)] = _huart1_buf; HAL_UART_Receive_IT(&huart1, &_huart1_buf, 1); } } ``` #### 定时器基础应用 最后,在涉及到时间间隔测量或者周期性事件触发的情况下,则需要用到定时器资源。例如,可以使用STM32内部集成的标准定时器(如TIM6/7)来进行精确的时间管理,从而实现诸如延时等待或是固定频率的任务调度等功能[^4]。 ```c // 使用CubeMX工具配置好硬件后,只需调用如下API启动计数过程即可 HAL_TIM_Base_Start_IT(&htim6); // 开启TIM6定时器中断模式 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值