verilog内的different 是 ^
不同位数的数值比较时: the upper bits are cut off
在Verilog中,0x34表示十六进制数,它的二进制表示为0011 0100,十进制表示为52。
锁存器 是电平敏感(非边沿敏感)电路,因此在一个始终块中,它们使用电平敏感灵敏度列表。但是,它们仍然是顺序元素,因此应该使用非阻塞赋值,D 锁存器在启用时就像一条线,在禁用时保留当前值。
同步异步FIFO 设计
first in first out
同步:用于数据缓冲器
异步:跨时钟域处理。
可用RAM(random access memory)设计
full不能写,empty不能读
方法1:长度计数器factor。写:factor+1;读:factor-1.
方法2:地址位扩展一位,最高位判断空满,低位地址:R_ADDR=W_ADDR.判断:高位相等=空,不相等=满。
Verilog和C的区别
Verilog和C是两种不同的编程语言,主要用于不同的应用领域。
-
应用领域:Verilog是一种硬件描述语言(HDL),主要用于描述数字电路的行为和结构。它被广泛应用于数字电路设计、半导体芯片设计、FPGA编程等领域。而C语言是一种通用的高级编程语言,主要用于软件开发,可以用于开发各种类型的应用程序。
-
语法结构:Verilog具有专门的语法和特性,以便于描述硬件电路的行为和结构,如时序逻辑、组合逻辑、寄存器、端口等。它还支持并行处理和并行模拟。相比之下,C语言是一种过程性编程语言,其语法更加通用,适用于编写复杂的算法和数据操作。
-
运行环境:Verilog代码通常需要在硬件描述工具中进行综合、仿真和硬件调试。而C语言代码可以在通用的计算机平台上直接编译和运行。
-
数据类型:Verilog主要支持位向量和寄存器等硬件相关的数据类型,用于表示和操作数字信号。而C语言提供了更多的数据类型,如整型、浮点型、指针等,用于处理更广泛的数据和操作。
需要注意的是,Verilog和C语言虽然在语法和应用领域上有区别,但它们也有一些共同之处,如变量、循环、条件判断等基本编程概念。这使得一些复杂的系统可能会同时使用Verilog和C语言来实现硬件和软件部分。
三角波发生器(状态机)
假设:上升状态为0,下降状态为1
在0:计数器进行加一操作,加到299
1:计数器进行减1操作,减到1
![在这里插入图片描述](https://img-blog.csdnimg.cn/348ae108c58a4e04ad79beb6916e920c.png
参考:https://blog.csdn.net/weixin_41788560/article/details/118443505
思路:分段,每段对应一个状态
`timescale 1ns/10ps
module tri_gen(
clk,
res,
d_out
);
input clk;
input res;
output [8:0] d_out;
reg [1:0] state;
reg [8:0] d_out;
reg [7:0] cnt;//counter for flag,max=200
always @(posedge clk,negedge res)
if(~res)
begin
state<=0;
d_out<=0;
cnt<=0;
end
else begin
case(state)
0://上升段
begin
d_out<=d_out+1;
if(d_out==9'd299)begin
state<=1;
end
end
1:begin
if(cnt==200)begin
state<=2;
cnt<=0;
end
else begin
cnt<=cnt+1;
end
end
2:begin
d_out<=d_out-1;
if(d_out==9'd1)begin
state<=0;
end
end
default://为了下降沿降到0
begin
state<=0;
cnt<=0;
d_out<=0;
end
endcase
end
endmodule
//testbench for tri_gen
module tri_gen_tb;
reg clk,res;
wire[8:0] d_out;
tri_gen u1(
.clk(clk),
.res(res),
.d_out(d_out)
);
initial begin
clk<=0;res<=0;
#17 res<=1;
#20000 $stop;//要改变运行时间长度
end
always #5 clk<=~clk;
endmodule
Testbench:
在定义端口时,testbench中对所有输入都定义为reg型,所有输出都定义为wire型。
timescale 1ns/1ns
/*题目描述:
请编写一个信号发生器模块,根据波形选择信号wave_choise发出相应的波形:
wave_choice=0时,发出方波信号;
wave_choice=1时,发出锯齿波信号;
wave_choice=2时,发出三角波信号。
*/
module signal_generator(
input clk,
input rst_n,
input [1:0] wave_choise,
output reg [4:0]wave
);
reg [4:0] cnt;//计算周期数,跟半周期数有关;
reg flag;//标志三角波;
//设置cnt;
always @(posedge clk,negedge rst_n)
begin
if(!rst_n)
cnt<=0;
else begin
if(wave_choise == 0)begin
if(cnt>=19)
cnt<=0;
else
cnt<=cnt+1;
end
else
cnt<=0;
end
end
//设置flag,flag信号用来表征三角脉冲的上升下降状态,高为上升,低为下降;
always @(posedge clk,negedge rst_n)
begin
if(!rst_n)
flag<=1;
else begin
if(wave_choise == 2)begin
if(wave == 19)
flag<=1;
else if(wave == 1)
flag<=0;
else
flag<=flag;
end
else begin
if(wave == 0)
flag<=0;
else
flag<=1;
end
end
end
always @(posedge clk,negedge rst_n)
begin
if(!rst_n)
wave<=0;
else begin
if(wave_choise == 0)begin
wave<=cnt<9? 0 : cnt<19? 20 : 0;产生方波,保持0十个时钟,保持20十个时钟.//三种波形wave最大值都为20;
end
else if(wave_choise == 1)begin
wave<= wave>=20? 0 : wave+1;产生锯齿,0递增到20
end
else if(wave_choise == 2)begin
wave<= flag == 1? wave-1:wave+1;//
end
else
wave<=0;
end
end
endmodule
//Testbench for signal_generator.
module signal_generator_tb;
reg clk;
reg rst_n;
reg [1:0] wave_choise;
wire [4:0] wave;
signal_generator DUT(
.clk(clk),
.rst_n(rst_n),
.wave_choise(wave_choise),
.wave(wave)
);
initial begin
clk = 0;
rst_n = 0;
wave_choise = 0;
#10 rst_n = 1;
#10 wave_choise = 0;
#2000 wave_choise = 1;
#2000 wave_choise = 2;
#10000 $finish;
end
always #5 clk = ~clk;
endmodule
一串比较有意思的代码
count<=(count+1)%6;//对于6bit数据,计数器实现了只在0-5之间循环;
同步动态随机存取内存(synchronous dynamic random-access memory,简称SDRAM)是有一个同步接口的动态随机存取内存(DRAM)。通常DRAM是有一个异步接口的,这样它可以随时响应控制输入的变化。而SDRAM有一个同步接口,在响应控制输入前会等待一个时钟信号,这样就能和计算机的系统总线同步。时钟被用来驱动一个有限状态机,对进入的指令进行管线(Pipeline)操作。这使得SDRAM与没有同步接口的异步DRAM(asynchronous DRAM)相比,可以有一个更复杂的操作模式。
管线意味着芯片可以在处理完之前的指令前,接受一个新的指令。在一个写入的管线中,写入命令在另一个指令执行完之后可以立刻执行,而不需要等待数据写入存储队列的时间。在一个读取的流水线中,需要的数据在读取指令发出之后固定数量的时钟频率后到达,而这个等待的过程可以发出其它附加指令。这种延迟被称为等待时间(Latency),在为计算机购买内存时是一个很重要的参数。
SDRAM 相关资料:https://blog.csdn.net/zhoutaopower/article/details/119877482
页突发模式(Page Burst Mode)是一种高速数据传输模式,用于在计算机的内存与外部设备之间传输数据。在这种模式下,数据被分割成较小的页(通常是4KB或8KB)进行传输,而不是像连续模式那样按照连续的字节或块进行传输。
页突发模式的主要特点是在一次传输中连续地传输多个数据页。这样做可以减少传输过程中的开销,提高传输效率。具体来说,当内存与外部设备之间的传输开始时,外部设备会请求连续的多个数据页,并在一次传输中将这些页连续地传输到内存中。这样,传输过程中的寻址开销和传输控制开销可以大大降低,从而提高数据传输的效率。
页突发模式通常用于处理大量数据的传输,例如在磁盘与内存之间进行数据交换、网络数据传输等场景。在这些场景下,使用页突发模式可以有效地提高数据传输的效率,减少传输过程中的开销。
I/O电路是指输入/输出电路,主要包括以下几种类型:
- 并行口(Parallel Port):用于将计算机与外部设备(如打印机)进行并行数据传输。
- 串行口(Serial Port):用于将计算机与外部设备进行串行数据传输,如串行通信、调制解调器等。
- 通用串行总线(Universal Serial Bus,USB):用于连接计算机与各种外部设备,如键盘、鼠标、U盘等,具有热插拔和高速传输等特点。
- 音频接口(Audio Interface):用于连接计算机与扬声器、麦克风等音频设备。
- 网络接口(Network Interface):用于连接计算机与局域网或互联网,实现网络通信功能,如以太网口、无线网卡等。
- 显示接口(Display Interface):用于连接计算机与显示器、投影仪等显示设备,如VGA接口、HDMI接口、DisplayPort接口等。
如 缓冲电路、检测电路、抗干扰电路、脉冲整形电路等电路单元
(1)输入/输出数据锁存器。 (2)控制命令和状态寄存器。 (3)地址译码器。 (4)读/写控制逻辑。 (5)中断控制逻辑。
而core电路是指计算机的核心电路,主要包括以下几种类型: - 中央处理器(Central Processing Unit,CPU):负责执行计算机的指令和控制各个硬件设备的工作,是计算机的核心组件。
- 内存(Random Access Memory,RAM):用于临时存储数据和程序指令,CPU通过读取、写入内存来进行数据处理。
- 图形处理器(Graphics Processing Unit,GPU):用于处理图形和图像相关的计算任务,如3D绘图、游戏渲染等。
- 输入输出控制器(Input/Output Controller,IOC):负责管理和控制计算机与外部设备之间的输入输出数据传输。
- 地址总线(Address Bus)和数据总线(Data Bus):用于在CPU和内存之间传递地址和数据。
- 时钟电路(Clock Circuit):用于提供计算机各个部件之间的同步时钟信号,控制计算机的工作节奏。
Linux命令:
rm <选项> [文件列表]
选项说明: -r 递归将目录及以下文件逐层删除; -i 删除前询问确认;
-f 指定强行删除无需确认,即使原文件属性设为只读; -v 详细:显示文件的删除速度。
移动文件命令:
mv <-f | -i> [文件1/目录1/文件列表][文件2/目录2/目录]
-f :若目标文件已存在,不提示直接覆盖已有文件。
-i:若目标文件有同名,则先询问是否覆盖已有文件;
-v:详细:显示文件移动速度。
文件内容统计命令:
wc <选项> 文件列表
统计指定文件中的字节数、字数、行数。
-c :统计字节数
-l:统计行数
-w:统计字数
查找文件:
find [目录列表][匹配标准]
eg: find -name “*.v” > rtl:找到名字为带.v后缀的文件,然后将此文件放到rtl文件夹内。
find . !-name error -print (.表示在当前目录下查找名字为error的文件,并打印出路径)
查找文件内容
grep <选项> [匹配字符串] [文件列表]
排序指令
sort <选项> [文件列表](对txt文件内容进行排序) -r倒序排序