自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 HDL—Circuits—Combinational Logic—Basic Gates(1)

有关此处使用的子模块,请参见 10 和 11。顶层设计由两个子电路 A 和 B 的实例组成,如下所示。创建一个有两个2位输入 A [1:0]和 B [1:0]的电路,并产生一个输出 z。如果 A = B,则 z 的值应为1,否则 z 应为0。模块 A 应该实现函数 z = (x ^ y) & x。计算出最小的运算方式然后直接写就可以了,具体运算方法叫。

2023-12-12 19:43:19 100

原创 HDL—Verilog Language—More Verliog Features—for loop

给定一个100位的输入向量[99:0] ,反转它的位顺序。

2023-12-12 18:55:34 89

原创 HDL—Verilog Language—More Verliog Features—Reduction operators

有时候,您想创建一个宽门,它对一个向量的所有位进行操作,如(a [0] & a [1] & a [2] & a [3] ...) ,如果向量很长,就会变得很乏味。| b [3:0] //OR: b [3] | b [2] | b [1] | b [0] . 相当于(b [3:0]!& a [3:0] //AND: a [3] & a [2] & a [1] & a [0] . 相当于(a [3:0] = = 4‘ hf)

2023-12-12 13:58:07 96

原创 HDL—Verilog Language—More Verliog Features—Conditional ternary operator

给出四个未签名的号码,找出最小值。无符号数可以与标准比较运算符(a < b)进行比较。使用条件运算符制作双向最小电路,然后组合其中几个来制作一个4向最小电路。这可以用来根据条件(mux!)选择两个值中的一个在一行中,不使用组合 always 块内的 if-then。b: a) //由 sel 选择的 a 和 b 之间的2对1多路复用器。3:5) //这是5,因为条件是假的。Verilog 有一个条件运算符(?条件为真 : 条件为假。中间结果可能需要一些线向量。

2023-12-12 13:49:12 85

原创 RT-Thread 线程间通信 信号量

一个线程运行的时候,如果需要某个资源,就会来询问这个资源还有多少,这个信号量就是记录资源的数量。将自己从readylist链表里面移除,挂在信号量的链表里面,开启线程的定时器。查看信号量的链表里面有没有等待信号量挂起的线程,唤醒这些等待的线程。当线程使用这个资源的时候,就会获取这个信号量,会让这个信号量--,当线程使用完之后,不再需要资源了,就要释放信号量,让信号量++。获取信号量,如果信号量还有,直接获取就可以。没有信号量,且不愿意等待,返回错误。之后再释放信号量,信号量++。

2023-11-23 21:10:45 66

原创 RT-Thread 线程间通信 邮箱(2)

这个函数的参数是,要读取的邮箱的名称,读取的值存放的地址,以及如果没读到内容要等待的时间,三个参数。这个函数的参数是,写入的邮箱的名称,写入的值,以及如果没写进去要等待的时间,三个参数。最后将邮箱内信息的数量,第一个信息的位置,最后一个信息的位置,设定为0.这几步就是根据给的邮箱内的个数,去创建一块地方,用于存放邮箱内的数据。将自己从系统的readtlist移除,并将自己挂在邮箱的链表里面,紧急,就是发送的数据放在邮箱第一个的位置。这个链表,两个使用的链表是不一样的。普通发送即等待时间为0。

2023-11-23 14:57:31 86

原创 RT-Thread 线程间通信 邮箱(1)

**邮箱中可以用的数据的个数*/rt_uint16_t out_offset;-->等待: -->线程进入阻塞,把自己记录在邮箱的链表里面。-->:等待:-->线程进入阻塞,把自己记录在邮箱的链表里面。消息队列里的数据的大小是创建消息队列的时候指定的,长度由。邮箱创建的时候,会划出一片空间,作为邮箱的数组,1、邮箱内存放的数据的大小是固定的,长度为。-->邮箱内没数据:等待?-->邮箱内有数据:成功。-->:没有空位:等待?

2023-11-23 14:57:11 74

原创 RT-Thread 线程间通信 消息队列(2)

->等待一段时间:-->另一个线程读的时候,唤醒陷入等待的线程。-->等待一段时间:-->另一个线程写的时候,唤醒陷入等待的线程。知道了消息队列的原理,创建消息队列搭建了一个什么东西,就好理解其他几个操作的函数的含义了。1、会先把自己从系统的readylist里面移除,不在系统的待运行的线程列表里面了。1、会先把自己从系统的readylist里面移除,不在系统的待运行的线程列表里面了。创建消息队列,根据给的几个参数,创建一个空闲的消息队列,组成消息块链表,-->不空:-->返回失败。

2023-11-22 20:19:33 131

原创 RT-Thread 线程间通信 消息队列(1)

创建的消息队列,线程A、B都可以往队列里发消息,线程C、D都可以从队列里写消息,来实现线程之间的通信。这段操作会把消息队列里面的消息块连起来,每一个消息块的next指着下一个消息块。最后把 mq->msg_queue_free指针,指向第一个空的消息块。创建队列,会根据msg_size,和max_msgs计算出队列的大小,假设线程A往队列里写消息,线程B从队列读消息,其过程是这样的。创建的消息队列需要,消息队列的大小,消息队列的数量,msg_size就是消息队列里面,每个消息块的大小。

2023-11-22 14:47:22 101

原创 RT-Thread线程内部机制(5)

在rt_tick_increase( )函数最后有一个rt_timer_check( )函数这个函数检测线程的timeout_tick是否到达设定的值,这个值一般是由线程睡眠或者线程延时函数设置的,检测到时间后,会调用rt_thread_timeout( )函数。

2023-11-20 15:15:02 138

原创 RT-Thread线程内部机制(4)

链表定时器。

2023-11-20 14:24:16 95

原创 RT-Thread线程内部机制(2)

rt_thread 用 thread 来表示一个线程,这一步创建了返回的线程句柄,也就是上面提到的 thread 结构体2、分配栈:这一步确定了栈的大小,也就是 thread -> stack_size3、初始化栈:thread -> sp 确定栈顶位置,1、修改thread -> sp的位置这三句的作用是sp从给出的栈地址开始向下移动stack_frame大小的空间这个stack_frame是用来后面虚构栈的内容用的 把这一部分虚构出来,并赋予虚构的值。最后实际使

2023-11-16 19:17:43 37

原创 RT-Thread线程内部机制(3)

函数的作用:1、分配一个rt_thread作为句柄2、分配线程的栈3、初始化这个栈内的参数。

2023-11-16 19:17:41 32

原创 RT-Thread线程内部机制(1)

RTOS代表实时操作系统(Real-Time Operating System)。一种专为实时应用程序设计的操作系统,用于控制嵌入式系统中的实时任务和事件。RTOS的主要特点是能够满足严格的时间约束和响应要求。

2023-11-16 14:34:58 66

原创 HDL—Verilog Language—Procedures—Avoiding latches

假设你正在为一个游戏构建一个处理PS/2键盘扫描代码的电路。给定接收到的扫描码的最后两个字节,你需要指出是否按下了键盘上的一个方向键。这涉及到一个相当简单的映射,可以实现为具有四种情况的case语句(或if-elseif)。其实还是case语句而已,但要注意每次输出之后,要把几个按键的值恢复到0.

2023-06-17 15:57:22 80

原创 HDL—Verilog Language—Procedures—Priority encoder with casez

显式指定优先级行为比依赖case项的顺序更不容易出错。还有一个类似的casex,它将x和z都视为无关紧要。我觉得用它来对付卡塞兹没什么意义。是z的同义词,所以2'bz0和2'b是一样的?

2023-05-29 21:02:50 230

原创 HDL—Verilog Language—Procedures—Priority encoder

优先编码器是一个组合电路,当给定一个输入位向量时,输出向量中前1位的位置。例如,一个输入为8'b10010000的8位优先编码器将输出3'd4,因为比特[4]是第一个高的比特。对于这个问题,如果所有输入位都不高(即输入为零),则输出为零。注意,一个4位的数字有16种可能的组合。这个问题主要是繁琐,就是判断所有的输入,然后给一个值输出。语法和普通case是一样的,只是说。这里介绍两个新的case语句。这里就使用了casex的用法。构建一个4位优先编码器。casex和casez。

2023-05-29 20:49:38 174

原创 HDL—Verilog Language—Procedures—Case statement

如果有大量的分支,Case语句比if语句更方便。因此,在这个练习中,创建一个6比1的多路复用器。当sel在0到5之间时,选择相应的数据输入。数据输入和输出都是4位宽。这一部分主要就是运用case语句。学会case语句的用法就可以。

2023-05-29 20:33:42 76

原创 HDL—Verilog Language—Procedures—If statement latches

arrive也是,当没到达的时候,gas_tank_empty也不是空的时候,就keep_driving。但没写else,后面if条件满足时就让keep_driving和gas_tank_empty值相反。但没写else语句,当不满足的时候,shut_off_computer会保持不变仍然为1。当cpu_overheated的时候,就shut_off_computer。这个主要是说明if条件满足了,就进到if语句中去。这个例程只要把if后面的else加上就可以了。这边例程给了一个错误代码。

2023-05-29 20:28:59 51

原创 HDL—Verilog Language—Procedures—If statement

构建一个2对1的mux,在a和b之间进行选择。如果sel_b1和sel_b2都为true,则选择b。执行相同的操作两次,一次使用assign语句,另一次使用过程性if语句。这里开始使用一个新的语法if。这两个语句的作用是一样的。

2023-05-29 18:38:48 95

原创 HDL—Verilog Language—Procedures—Always blocks(clocked)

用三种方式构建异或门:使用assign语句、组合always语句块和时钟always语句块。请注意,时钟always块产生的电路与其他两个不同:有一个触发器,因此输出被延迟。连续赋值 (assign x = y;不能在过程中使用(“always块”)。非阻塞赋值: (x <= y;阻塞赋值: (x = y;注意在上升沿触发的过程中会产生一定的延迟。在verilog中赋值语句也有三种。always块也有两种。就是电平触发和沿触发。

2023-05-29 17:37:49 55

原创 HDL—Verilog Language—Procedures—Always blocks(combinational)

使用assign语句和always组合代码块构建AND门。(由于assign语句和combinational always语句的作用相同,因此没有办法强制你同时使用这两种方法。但你是来练习的,对吧?赋值的时候既可以用assign也可以用always。assign 左边可以用wire型。always 内的用reg型。

2023-05-29 17:29:32 65

原创 HDL—Verilog Language—Modules:Hierarchy—Adder-subtractor

当sub为1时,使用32位宽异或门对b输入进行反转。(这也可以看作是b[31:0]异或,sub复制32次。还要将子输入连接到加法器的进位。模块add16(输入[15:0]a,输入[15:0]b,输入cin,输出[15:0]sum,输出cout);加法器可以通过任选地对一个输入取反来构造加法器-减法器,这相当于对输入取反再加1。这里实际上就是说一下加法器和减法器的相似之处,如何把加法器改成减法器。

2023-05-29 11:28:29 96

原创 HDL—Verilog Language—Modules:Hierarchy—Carry-select adder

在这个练习中,你将使用与前一个练习相同的模块add16,它将两个带进位的16位数字相加,并生成一个带进位的16位和。之前几个写的不论是1位加法器还是16位的加法器,实际上都是1位的,可以观察到,如果前面cout没有给出进位的数据,后面是没法开始运算的,所以前面的加法器就会很慢,延迟很高。但实际上,后面模块的运算可以优先进行,把进位是0和1的值都算出来,然后通过判断cout是0还是1,直接输出,这样就可以节约在知道cout的值之后,还需给运算的时间。如下图所示,将模块连接在一起。

2023-05-29 11:11:03 180

原创 HDL—Verification:Reading Simulations—Build a circuit from a simulation waveform—Sequential circuit 8

读取模拟波形以确定电路的功能,然后实施它。clock为0的时候,p输出q的信号。clock为1的时候,p输出a的信号。q的电平信号变为此时a的电平信号。当clock出现下降沿的时候,

2023-05-29 09:29:12 119

原创 HDL—Verilog Language—Modules:Hierarchy—Adder2

一个add16模块计算加法结果的低16位,而第二个add16模件计算结果的高16位。您的top_module将实例化add16的两个副本(已提供),每个副本将实例化add1的16个副本(必须编写)。注意看题啊,只要编写两个模块top_module和add1模块,我第一边写连着add16一起写了,但得自己设计add1模块。可以把这三个输入位拼接起来,然后直接利用case判断a、b、cin拼接的值判断cout和sum的输出。top和add1的设计是一样的,连起来就好了。三个输入:值a、值b、进位cin。

2023-05-28 12:23:52 159

原创 HDL—Verilog Language—Modules:Hierarchy—Adder1

您将得到一个执行16位加法的模块add16。实例化其中两个以创建一个32位加法器。在接收到来自第一加法器的进位之后,一个加法器16模块计算加法结果的低16位,而第二加法器16模块则计算结果的高16位。32位加法器不需要处理进位输入(假定为0)或进位输出(忽略),但内部模块需要处理才能正常工作。(换句话说,add16模块执行16位a+b+cin,而您的模块执行32位a+b)。这个也很简单,就是在例化module的时候,在接口里面注意每个信号的为快就可以了。如下图所示,将模块连接在一起。

2023-05-28 11:44:02 73

原创 HDL—Verilog Language—Modules:Hierarchy—Modules and vectors

此外,创建一个4对1多路复用器(未提供),根据sel[1:0]选择输出内容:输入d、第一个、第二个或第三个d触发器之后的值。然后注意在使用always@()内部设置激励信号的时候,里面不要用posedge clk,如果使用这个会导致和目标有一个时钟节拍的延迟,里面的信号最好使用*always@(*):首先 * 的意思就代表了always模块里面的所有信号,模块内的任何一个信号发生变化,就会立刻执行。八选一多路器实际上就是按照sel的值,在几个输入口里面(0-3),选择一个的值输出,

2023-05-28 11:34:13 92

原创 HDL—Verilog Language—Modules:Hierarchy—Three modules

您得到了一个具有两个输入和一个输出的模块my_dff(它实现了一个D触发器)。实例化其中的三个,然后将它们链接在一起,形成长度为3的移位寄存器。clk端口需要连接到所有实例。这个只要记住例化的方法其实很简单,就是把模块例化三次,然后连上线就可以了。提供给您的模块是:模块my_dff(输入clk,输入d,输出q);中间将信号连起来的时候要声明两个wire型的信号,用于中间的连线。注意每个例化模块的名字要不一样。

2023-05-28 10:57:30 74

原创 HDL—Verilog Language—Modules:Hierarchy—Connecting ports by name

模块名 例化后的的模块名(.模块的信号名(top中与模块连接的信号的名字),这个就给了mod_a内的信号名,就可以用这种方式例化了。.模块的信号名(top中与模块连接的信号的名字),.模块的信号名(top中与模块连接的信号的名字)把信号线按这个表格连起来。

2023-05-28 10:37:50 57

原创 HDL—Verilog Language—Modules:Hierarchy—Connecting ports by position

此问题与上一个问题(模块)类似。您将得到一个名为mod_a的模块,该模块按顺序有2个输出和4个输入。您必须按位置将6个端口按顺序连接到顶级模块的端口out1、out2、a、b、c和d。这个会按照mod_a内部的信号的顺序直接接线,算是一种偷懒的方式,但我不是很喜欢用,容易出错,不过在信号特别多的时候用起来确实很方便。但这里因为没给mod_a内的每个信号的名字,所以必须要提另一个例化模块接线的方法。您将获得以下模块:模块mod_a(输出,输出,输入,输入,输出);很简单,实际上就是更多的连线而已。

2023-05-28 10:33:22 115

原创 HDL—Verilog Language—Modules:Hierarchy—Modules

在本练习中,创建模块mod_a的一个实例,然后将模块的三个引脚(in1、in2和out)连接到顶级模块的三条端口(导线a、b和out)。模块名 例化后的的模块名(.模块的信号名(top中与模块连接的信号的名字),现在要在顶层模块(top_module)中实例化这个部分。.模块的信号名(top中与模块连接的信号的名字),.模块的信号名(top中与模块连接的信号的名字)这一部分主要介绍模块例化部分的内容。所以这个题目的做法也很简单。

2023-05-28 10:24:03 79

原创 HDL—Verilog Language—Vectors—More replication

给定五个1位信号(a、b、c、d和e),计算25位输出矢量中的所有25个成对1位比较。如果被比较的两个比特相等,则输出应该是1。但很显然就不酷了,所以用位拼接把信号拼接起来然后直接使用按位异或就可以了。如果是直接去一位一位的写也是可以的,

2023-05-28 10:13:26 53

原创 HDL—Verilog Language—Vectors—Replication operator

构建一个将8位数字符号扩展为32位的电路。这需要符号位的24个副本的级联(即,复制位[7]24次),然后是8位数字本身。就是把vector信号复制num份,然后拼起来。主要是学会使用重复信号的用法。

2023-05-28 10:03:24 116

原创 HDL—Verilog Language—Vectors—Vector reversal 1

利用上一个位拼接运算符,可以把in每一位反过来拼接起来,然后输出。给定一个8位输入矢量[7:0],反转其位顺序。

2023-05-28 09:11:59 254

原创 HDL—Verilog Language—Vectors—Vector concatenation operator

给定几个输入向量,将它们连接在一起,然后将它们拆分为几个输出向量。有六个5位输入矢量:a、b、c、d、e和f,总共30位输入。有四个8位输出矢量:w、x、y和z,用于32位输出。{4'ha, 4'd10} => 8'b10101010 //这里4‘ha实际上是4’b1010,4‘d10实际是4’b1010。注意放在里面的信号必须是确定位数的,不能直接随便丢个数字进去,拼接运算符 { },可以将里面的信号拼接成一个更宽的信号。图片画的还是很清楚的,就是用拼接运算符将这些拼接起来。{1,2,3}这种就不行。

2023-05-27 20:17:12 147

原创 HDL—Verilog Language—Vectors—Four-input gates

构建一个具有四个输入的组合电路。out_and:4输入and门的输出。out_xor:4输入xor门的输出。out_or:4输入或门的输出。这个其实就是记住运算符就可以了。

2023-05-27 20:00:50 128

原创 HDL—Verilog Language—Vectors—Bitwise operators

整体是不难的,主要注意按位或的运算符是 | 逻辑或的运算符是 ||逻辑就是把数值视为一个整体来运算,按位就是一位一位去运算,逻辑的输出只有1或者0,是一位的,按位是输入n位就会产生n位的输出。将b的倒数放在out_not的上半部分(即bits[5:3]),将a的倒数放置在下半部分。逻辑非就是,只要值不是纯0,就输出0。如果是纯0,就输出1。构建一个具有两个3位输入的电路,该电路计算两个向量的。逻辑或就是,只要两个数不都是纯0,就输出1。逆其实也有值得注意的地方。

2023-05-27 19:53:51 47

原创 HDL—Verilog Language—Vectors—Vector part select

一个32位矢量可以被视为包含4个字节(位[31:24]、[23:16]等)。构建一个电路,反转4字节字的字节顺序。当一段数据的端序需要交换时,例如在许多互联网协议中使用的小端x86系统和大端格式之间,经常使用此操作。也是很简单,就是把输入的接口按他需要的顺序再给接出去就可以。

2023-05-27 15:56:24 55

原创 HDL—Verilog Language—Vectors—Vectors in more detail

构建一个组合电路,将输入的半字(16位,[15:0])拆分为低位[7:0]和高位[15:8]字节。就是把低几位和高几位的线分开和输出assign起来。

2023-05-27 15:45:40 46

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除