1、异步复位同步释放代码:
异步复位同步释放verilog代码及理解
异步复位同步释放(目录里有些ic手撕代码的连接)
2、单bit数据如何打拍veriog写法:
一个寄存器就打一拍;
异步处理一般是打两拍;
打三拍是为了判断上升沿或下降沿。
跨时钟域电路设计——单bit信号
【数字IC手撕代码】Verilog单bit跨时钟域快到慢,慢到快,(打两拍,边沿同步,脉冲同步)|题目|原理|设计|仿真
3、任意奇数倍时钟分频
RTL基本知识:奇数分频器
Verilog奇数分频(个人总结)
个人理解:三种方法
进行奇数分频时一定要注意获取到原时钟周期的半个周期
(1) 两个时钟“或”:
设置两个计数器,计数上限是分频系数减一(dividor - 'd1),宽度为[$clog2(dividor+1)-1:0](求对数,设置参数位宽,防止位宽浪费),两计数器分别在时钟的上升沿和下降沿跳变。之后设置两个时钟clk1和clk2,clk1分别在上升沿计数器值为(dividor - 1)和(dividor - 1)/2时翻转,clk2同理在下降沿计数器为(dividor - 1)和(dividor - 1)/2时反转,之后clk1和clk2相或即可。
`timescale 1ns/1ns
module clk_divider
#(parameter dividor = 5)
( input clk_in,
input rst_n,
output clk_out
);
reg [$clog2(dividor+1)-1:0] cnt_r1;
reg [$clog2(dividor-1):0] cnt_r2;
reg clk_pos;
reg clk_neg;
always @(posedge clk_in or negedge rst_n) begin
if (!rst_n) begin
cnt_r1 <= 'd0;
end
else begin
if(cnt_r1 == (dividor - 'd1))
cnt_r1 <= 'd0;
else
cnt_r1 <= cnt_r1+'d1;
end
end
always @(negedge clk_in or negedge rst_n) begin
if (!rst_n) begin
cnt_r2 <= 'd0;
end
else begin
if(cnt_r2 == (dividor - 'd1))
cnt_r2 <= 'd0;
else
cnt_r2 <= cnt_r2+'d1;
end
end
always @(posedge clk_in or negedge rst_n) begin
if (!rst_n) begin
clk_pos <= 'd0;
end
else if ((cnt_r1 == (dividor - 1)) | (cnt_r1 == ((dividor -'d1)/2))) begin
clk_pos <= ~clk_pos;
end
else begin
clk_pos <= clk_pos;
end
end
always @(negedge clk_in or negedge rst_n) begin
if (!rst_n) begin
clk_neg <= 'd0;
end
else if ((cnt_r2 == (dividor - 1)) | (cnt_r2 == ((dividor - 'd1)/2))) begin
clk_neg <= ~clk_neg;
end
else begin
clk_neg <= clk_neg;
end
end
assign clk_out = clk_pos | clk_neg;
endmodule
(2) 两个时钟“与”:
同上,时钟在0 和(dividor + 1)/2时翻转,两个时钟相与。
(3) 两个时钟“异或”:
只需要一个上升沿计数器cnt1,时钟clk1在上升沿触发,计数器计满(dividor - 'd1)时候翻转。时钟clk2在下降沿触发,计数器计满((dividor - 'd1)/2)时候翻转。之后两个时钟异或。
小数分频,例:3.5
3.5分频就是七个时钟周期里,前三个半后三个半高电平跳变一样就行。
4、Moore型状态机和Mealy型状态机区别以及序列检验器
1:在波形上区别:以一个序列检测器为例,检测到输入信号11时输出z为1,其他时候为0。用摩尔型FSM实现需要用到三个状态(A,B,C)。而用米利型FSM实现则需要两个状态(A,B)。摩尔型FSM输出函数的输入只由状态变量决定,要想输出z=1,必须C状态形成,即寄存器中的两个1都打进去后才可以。输出z=1会在下一个有效沿到来的时候被赋值。而米利型FSM输出函数是由输入和状态变量共同决定的。状态在B的时候如果输入为1,则直接以组合电路输出z=1,不需要等到下个有效沿到来。从而也就不需要第三个状态C。
2:摩尔状态机更安全:输出在时钟边沿变化(总是在一个周期后)。在Mealy机器中,输入更改可能会在逻辑完成后立即导致输出更改, 当两台机器互连时出现大问题 ,如果不小心,可能会发生异步反馈。
3:Mealy状态机对输入的反应更快:在相同的周期内反应 - 不需要等待时钟。在Moore机器中,可能需要更多逻辑来将状态解码为输出 - 在时钟边沿之后更多的门延迟。并非所有时序电路都可以使用Mealy模型实现。 一些时序电路只能作为摩尔机器实现。
(自己的理解就是米勒少个判定状态,并且在三段式状态机的第三段输出段有个状态机和当前输入的共同判定)
牛客网序列检验代码
这里有个注意点:三段式的第三段case(n_s)还是case(c_s)?输出阻塞还是非阻塞?状态机里状态跳转是阻塞还是非阻塞?
case(n_s)还是case(c_s)都可以,区别是n_s会提前一拍;输出阻塞还是非阻塞不影响输出延迟;状态机跳转是非阻塞赋值输出再延一拍。
这道牛客题比较缺德,他不管你拍子是否对上,就要求第三段输出要判断c_s。
Moore型状态机和Mealy型状态机
Moore型状态机和Mealy型状态机的区别
4、数字IC秋招手撕代码(七)找序列中的第一个1
二分法
寻找序列中的第一个1
用Verilog实现寻找第一个1和最后一个1的位置