1、 Altera的PLL的arest是高电平复位,当锁相环稳定输出后会把locked拉高
2、 定义寄存器变量时:
reg [9:0] data [63:0];
这个语句定义的是64个10位的data,在使用时data [x] [y] 表示第x个data的第y位。
3、 写if语句时
if()
else()
if //①
else if
else
if //②
else if
else
①和②是两个if块,当跳出第一个if块后,第二个if块也要运行。
4、 阻塞赋值的理解
reg gate_fs_d0 ;
reg gate_fs_d1 ;
assign neg_gate_fs = gate_fs_d1 & (~gate_fs_d0);
always @(posedge clk_fs or negedge rst_n) begin
if(!rst_n) begin
gate_fs_d0 <= 1'b0;
gate_fs_d1 <= 1'b0;
end
else begin
gate_fs_d0 <= gate_fs;
gate_fs_d1 <= gate_fs_d0;
end
end
这个neg_gate_fs会在gate_fs下降沿到来的时刻立即置1,不会延迟1个 clk_fs再置1。虽然可以用延迟1个clk赋值来理解阻塞赋值,但对于这里不能那样去理解。
5、 inout端口的使用方法(比较一下DHT11和EEPROM实验中两种inout使用的方法)
法一:
当用作输出端口时,用reg来赋值,把需要输出的量赋给reg变量
inout dht11 , //dht11温湿度传感器单总线
reg dht11_buffer; //DHT11输出信号
assign dht11 = dht11_buffer;
当用作输入端口时,要给reg赋值高阻态,然后再去读输入
dht11_buffer <= 1'bz; //起始信号结束后释放总线
DHT11实验中,我们对dht11_buffer的赋值(赋高低电平,不是高阻态),会影响dht11_pos和dht11_neg的值,所以当我们需要测得真实的inout的口的电平变化时,要先给dht11_buffer高阻态,这个时候的dht11_pos和dht11_neg值才准确。
法二:
assign sda = sda_dir ? sda_out : 1'bz; // SDA数据输出或高阻
assign sda_in = sda ; // SDA数据输
改变 sda_dir 的值就能改变sda的端口属性
6、 在rtc实时时钟的程序中,判断按键键值没用key_flag信号,因为按键模块和pcf8583模块的时钟不同,key_flag只持续了快时钟域的一个clk,在慢时钟域的pcf8583模块可能采不到,虽然可以用异步信号的同步方法处理,但这个实验中有一种更简单的方法,用key_value的下降沿来判断。因为key_value在按键消抖后才会被赋值,所以不怕抖动的影响。
7、 位拼接时,不管被拼接的原量以什么进制存储,在拼接时,都是二进制按顺序拼接。比如hour,min,sec全部按十进制赋值,但拼接时会转为二进制11_1_100,转为10进制是不等于314的。假如hour,min,sec不用parameter 定义,而是用的四位reg,则拼接时是0011_0001_0100。
parameter hour=4'd3;
parameter min =4'd1;
parameter sec =4'd4;
assign rtc_time = {hour,min,sec};
8、 可综合的for循环(网上看的没试过,以后有空试一下)
always@(posedge clk) begin : for_
for(integer index = 0; index < 10; index = index + 1) begin
data[index] <= data[index] + 1;
end
end
8、
在组合逻辑中,在应用条件语句时(例如if_else;case等),没有列出所有的可能情况,就会生成锁存器