文章目录
- 1.CMOS基本逻辑电路
- 2.异或逻辑
- 3.卡罗图简化函数
- 4.二进制,格雷码互转
- 5.产生锁存器latch
- 6.异步复位同步释放
- 7.SRAM,FALSHMEMORY,DRAM,SSRAM及SDRAM的区别?
- 8 如何防止亚稳态
- 9.奇数,偶数,任意分频
-
- 任意偶数分频:
- 任意奇数分频占空比(50%)
- 10.FIFO
-
- 十进制转格雷码
- 11.快时钟域脉冲信号到到慢时钟域信号
-
- 11.1脉冲同步
- 11.2电平同步
- 12.i++,i--,++i,--i
-
- *p++,*++P,++*p
- 13.BUCK电路
- 14.数字IC设计流程
- 15.为什么使用独热码,并不使用二进制编码或者格雷码
-
- 1.1编码方式也能降低功耗,比如格雷码每次只变化1bit,就比二进制编码降低了功耗。
- 16 RAM和ROM
-
- SDRAM / SRAM
- 17.&和&&
- 18.状态机
- 19.竞争与冒险
- 20.同步电路和异步电路
- 21.同步复位和异步复位
- 22.全加器和半加器
- 23.任务和函数
- 24.线性移位寄存器
- 25.CMOS实现Y=AB+C电路与版图
- 26.二四译码器
- 27.任意分频
- 28.静态时序分析
-
- 28.1中心对齐模式
- 28.2边沿对齐模式
- 28.3异步时钟,跨时钟域处理
- 29.异步双口RAM和同步双口RAM
- 30.阻塞赋值与function函数
- 31.Tmin计算,即最大频率计算
- 32.FPGA底层知识
-
- 1.FPGA组成
- 2.MMCM,PLL
- 3. Bram,Dram
- 32.项目芯片型号以及资源使用情况
-
- 项目一:
- 项目二
- 项目三
- 33.静态功耗和动态功耗
- 34.Tsetup/Tholdup
-
- 1.clock jitter:
- 2.clock skew:
- 3.时序为例
- 35.前端设计的流程,每个流程是干什么的?
-
- 1.STA(StaticTiming Analysis, STA)静态时序分析,
- 2.formal形式验证:
- 3.DFT
- 36.请描述跨时钟域设计时会出现的问题及解决办法
- 37.一个16bit序列,每个clk左移一位,要求检测5的倍数。
- 38.负数的表示方法
- 39.initial串 / fork jion并
- 40.二态和四态变量
- 41. Verilog
-
- 1.描述语言4个层次
- 2. verilog 中缺省的数据类型为?
- 42.基本数据类型的存储空间长度排序为
- 43.补码二进制转十进制
- 44. 操作系统:
- 45. timescale
- 46.串行总线
- 47.大小端模式
- 48.缩写全称
- 49.Memory hierarchy (存储结构)
-
- 1.当前计算机一般都采用高速缓存-主存-辅存三级存储器结构
- 50.二值逻辑和四值逻辑
- 51.芯片参数
- 52.时钟抖动(jitter) 和时钟偏斜(skew)
- 53.DCM/PLL/DLL/MMCM
- 54.理解FPGA中的RAM、ROM和CAM;ROM、RAM、DRAM、SRAM、FLASH
- 55. 与非门、或非门可以表达任何逻辑表达式
- 56.锁存器(latch)和触发器(filp-flop)的概念和区别?为什么多用register。行为级描述中latch如何产生的?
- 57.时序分析案例
- 58.跨时钟域处理
- 59.outsatanding/out-of-order/interleaving
- 60.axi3和axi4的区别
-
- 1.burst length
- 2.增加QoS(quality of service)
- 3.增加Multiple region interface
- 4. 修改了write response dependencies
- 5.AWCACHE/ARCHACHE的修改
- 6.Removal of WID
1.CMOS基本逻辑电路
2.异或逻辑
3.卡罗图简化函数
https://blog.youkuaiyun.com/hahasusu/article/details/88244155
4.二进制,格雷码互转
5.产生锁存器latch
6.OC门,OD门
6.异步复位同步释放
always @ (posedge clk or negedge rst_async_n)
if (!rst_async_n) begin
rst_s1 <= 1'b0;
rst_s2 <= 1'b0;
end
else begin
rst_s1 <= 1'b1;
rst_s2 <= rst_s1;
end
assign rst_sync_n = rst_s2;
endmodule
7.SRAM,FALSHMEMORY,DRAM,SSRAM及SDRAM的区别?
SRAM:静态随机存储器,存取速度快,但容量小,掉电后数据会丢失,不像DRAM 需要不停的REFRESH,制造成本较高,通常用来作为快取(CACHE) 记忆体使用。
FLASH:闪存,存取速度慢,容量大,掉电后数据不会丢失
DRAM:动态随机存储器,必须不断的重新的加强(REFRESHED) 电位差量,否则电位差将降低至无法有足够的能量表现每一个记忆单位处于何种状态。价格比SRAM便宜,但访问速度较慢,耗电量较大,常用作计算机的内存使用。
SSRAM:即同步静态随机存取存储器。对于SSRAM的所有访问都在时钟的上升/下降沿启动。地址、数据输入和其它控制信号均于时钟信号相关。
SDRAM:即同步动态随机存取存储器。
8 如何防止亚稳态
亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个 正确的电平上。在这个稳定期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。
解决方法:
1 降低系统时钟频率
2 用反应更快的FF
3 引入同步机制,防止亚稳态传播(可以采用前面说的加两级触发器)。
4 改善时钟质量,用边沿变化快速的时钟信号
9.奇数,偶数,任意分频
任意偶数分频:
module Divider(
input wire clk,
input wire rst_n,
output reg clk_div
);
parameter NUM_DIV = 6;
parameter Cyc_cnt = 3;//占空比
reg [3:0] cnt;
always @(posedge clk or posedge rst_n) begin
if (!rst_n) begin
cnt <= 'd0;
end
else if (cnt==NUM_DIV-1) begin
cnt <= 'd0;
end
else begin
cnt <= cnt + 1'b1;
end
end
always @(posedge clk or posedge rst_n) begin
if (!rst_n) begin
clk_div <= 1'b0;
end
else if (cnt > Cyc_cnt-1) begin
clk_div <= 1'b0;
end
else begin
clk_div <= 1'b1;
end
end
endmodule
任意奇数分频占空比(50%)
任意奇数分频占空比(50%)
module Divider(
input wire clk,
input wire rst_n,
output wire clk_div
);
//奇分频
parameter NUM_DIV = 7;
//parameter Cyc_cnt = 7;
reg [2:0] cnt1;
reg [2:0] cnt2;
reg clk_div1,clk_div2;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt1 <= 'd0;
end
else if (cnt1 == NUM_DIV-1) begin
cnt1 <= 'd0;
end
else begin
cnt1 <= cnt1 + 1'b1;
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
clk_div1 <= 1'b0;
end
else if (cnt1 < (NUM_DIV-1)/2) begin
clk_div1 <= 1'b1;
end
else
clk_div1 <= 1'b0;
end
always @(negedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt2 <= 'd0;
end
else if (cnt2 == NUM_DIV-1 ) begin
cnt2 <= 'd0;
end
else begin
cnt2 <= cnt2 + 1'b1;
end
end
always @(negedge clk or negedge rst_n) begin
if (!rst_n) begin
clk_div2 <= 1'b0;
end
else if (cnt2 < (NUM_DIV-1)/2) begin
clk_div2 <= 1'b1;
end
else
clk_div2 <= 1'b0;
end
assign clk_div = clk_div1 | clk_div2;
always
10.FIFO
assign w_full = (r_addr[2:0]==w_addr[2:0]&&r_addr[3]==(~w_addr[3]));
assign r_empty = (r_addr[3:0]==w_addr[3:0]);
十进制转格雷码
格雷码=(十进制数》1)^(十进制数)
11.快时钟域脉冲信号到到慢时钟域信号
11.1脉冲同步
module top(
input rst_n,
input clka, //快时钟
input clkb, //慢时钟
input pulse_ina,
output pulse_outb
);
reg signal_a;
reg signal_b0,signal_b1,signal_b2,signal_b3;
reg [1:0] signal_a_r;
reg [1:0] signal_b_r;
assign pulse_outb= signal_b0^signal_b1;
//在clka时钟下将signal_a展宽
always @(posedge clka or negedge rst_n)
if(!rst_n)
signal_a <= 1'b0;
else if(pulse_ina)
signal_a <= ~signal_a;
always @(posedge clkb or negedge rst_n)
if(!rst_n)begin
signal_b0 <= 1'b0;
signal_b1 <= 1'b0;
signal_b2 <= 1'b0;
signal_b3 <= 1'b0;
end
else begin
signal_b0 <= signal_a;
signal_b1 <= signal_b0;
signal_b2 <= signal_b1;
signal_b3 <= signal_b2;
end
endmodule
11.2电平同步
module top(
input rst_n,
input clka, //快时钟
input clkb, //慢时钟
input pulse_ina,
output pulse_outb
);
reg signal_a;
reg signal_b0,signal_b1,signal_b2,signal_b3;
assign pulse_outb= signal_b1 &(~signal_b2);
//在clka时钟下将signal_a展宽
always @(posedge clkb or negedge rst_n)
if(!rst_n)begin
signal_b0 <= 1'b0;
signal_b1 <= 1'b0;
signal_b2 <= 1'b0;
signal_b3 <= 1'b0;
end
else begin
signal_b0 <= pulse_ina;
signal_b1 <= signal_b0;
signal_b2 <= signal_b1;
end
endmodule
12.i++,i–,++i,–i
1、i++,先引用i的值,后增加i的值,
如int i=10;
int a=i++;
该程序运行后,a=10,而i=11。
2、i–,先引用i的值,后i的值减1。
如int i=10;
int a=i–;
该程序运行之后,a=10,i=9。
除了以上的用法外,还有一种表示法是++i或者–i,这种表示法i的值也会相应的自增1或者自减1,i的结果和i++与i–是相同的,但是当赋值给另一个变量时,对赋值的变量,结果却存在差别,因为++i代表先增加