HDLBits题目
文章平均质量分 57
HDLBits上题目的翻译以及解法,希望可以帮到正在学习Verilog的小伙伴
Annu-HoldOn
这个作者很懒,什么都没留下…
展开
-
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 · 88 阅读 · 0 评论 -
HDL—Verilog Language—More Verliog Features—for loop
给定一个100位的输入向量[99:0] ,反转它的位顺序。原创 2023-12-12 18:55:34 · 81 阅读 · 0 评论 -
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 · 85 阅读 · 0 评论 -
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 · 77 阅读 · 0 评论 -
HDL—Verilog Language—Procedures—Avoiding latches
假设你正在为一个游戏构建一个处理PS/2键盘扫描代码的电路。给定接收到的扫描码的最后两个字节,你需要指出是否按下了键盘上的一个方向键。这涉及到一个相当简单的映射,可以实现为具有四种情况的case语句(或if-elseif)。其实还是case语句而已,但要注意每次输出之后,要把几个按键的值恢复到0.原创 2023-06-17 15:57:22 · 75 阅读 · 0 评论 -
HDL—Verilog Language—Procedures—Priority encoder with casez
显式指定优先级行为比依赖case项的顺序更不容易出错。还有一个类似的casex,它将x和z都视为无关紧要。我觉得用它来对付卡塞兹没什么意义。是z的同义词,所以2'bz0和2'b是一样的?原创 2023-05-29 21:02:50 · 209 阅读 · 0 评论 -
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 · 163 阅读 · 0 评论 -
HDL—Verilog Language—Procedures—Case statement
如果有大量的分支,Case语句比if语句更方便。因此,在这个练习中,创建一个6比1的多路复用器。当sel在0到5之间时,选择相应的数据输入。数据输入和输出都是4位宽。这一部分主要就是运用case语句。学会case语句的用法就可以。原创 2023-05-29 20:33:42 · 72 阅读 · 0 评论 -
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 · 44 阅读 · 0 评论 -
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 · 89 阅读 · 0 评论 -
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 · 46 阅读 · 0 评论 -
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 · 59 阅读 · 0 评论 -
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 · 90 阅读 · 0 评论 -
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 · 172 阅读 · 0 评论 -
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 · 106 阅读 · 0 评论 -
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 · 152 阅读 · 0 评论 -
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 · 61 阅读 · 0 评论 -
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 · 87 阅读 · 0 评论 -
HDL—Verilog Language—Modules:Hierarchy—Three modules
您得到了一个具有两个输入和一个输出的模块my_dff(它实现了一个D触发器)。实例化其中的三个,然后将它们链接在一起,形成长度为3的移位寄存器。clk端口需要连接到所有实例。这个只要记住例化的方法其实很简单,就是把模块例化三次,然后连上线就可以了。提供给您的模块是:模块my_dff(输入clk,输入d,输出q);中间将信号连起来的时候要声明两个wire型的信号,用于中间的连线。注意每个例化模块的名字要不一样。原创 2023-05-28 10:57:30 · 67 阅读 · 0 评论 -
HDL—Verilog Language—Modules:Hierarchy—Connecting ports by name
模块名 例化后的的模块名(.模块的信号名(top中与模块连接的信号的名字),这个就给了mod_a内的信号名,就可以用这种方式例化了。.模块的信号名(top中与模块连接的信号的名字),.模块的信号名(top中与模块连接的信号的名字)把信号线按这个表格连起来。原创 2023-05-28 10:37:50 · 53 阅读 · 0 评论 -
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 · 112 阅读 · 0 评论 -
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 · 69 阅读 · 0 评论 -
HDL—Verilog Language—Vectors—More replication
给定五个1位信号(a、b、c、d和e),计算25位输出矢量中的所有25个成对1位比较。如果被比较的两个比特相等,则输出应该是1。但很显然就不酷了,所以用位拼接把信号拼接起来然后直接使用按位异或就可以了。如果是直接去一位一位的写也是可以的,原创 2023-05-28 10:13:26 · 48 阅读 · 0 评论 -
HDL—Verilog Language—Vectors—Replication operator
构建一个将8位数字符号扩展为32位的电路。这需要符号位的24个副本的级联(即,复制位[7]24次),然后是8位数字本身。就是把vector信号复制num份,然后拼起来。主要是学会使用重复信号的用法。原创 2023-05-28 10:03:24 · 106 阅读 · 0 评论 -
HDL—Verilog Language—Vectors—Vector reversal 1
利用上一个位拼接运算符,可以把in每一位反过来拼接起来,然后输出。给定一个8位输入矢量[7:0],反转其位顺序。原创 2023-05-28 09:11:59 · 242 阅读 · 0 评论 -
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 · 138 阅读 · 0 评论 -
HDL—Verilog Language—Vectors—Four-input gates
构建一个具有四个输入的组合电路。out_and:4输入and门的输出。out_xor:4输入xor门的输出。out_or:4输入或门的输出。这个其实就是记住运算符就可以了。原创 2023-05-27 20:00:50 · 110 阅读 · 0 评论 -
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 · 43 阅读 · 0 评论 -
HDL—Verilog Language—Vectors—Vector part select
一个32位矢量可以被视为包含4个字节(位[31:24]、[23:16]等)。构建一个电路,反转4字节字的字节顺序。当一段数据的端序需要交换时,例如在许多互联网协议中使用的小端x86系统和大端格式之间,经常使用此操作。也是很简单,就是把输入的接口按他需要的顺序再给接出去就可以。原创 2023-05-27 15:56:24 · 49 阅读 · 0 评论 -
HDL—Verilog Language—Vectors—Vectors in more detail
构建一个组合电路,将输入的半字(16位,[15:0])拆分为低位[7:0]和高位[15:8]字节。就是把低几位和高几位的线分开和输出assign起来。原创 2023-05-27 15:45:40 · 41 阅读 · 0 评论 -
HDL—Verilog Language—Basics—7458 chips
您可以选择使用assign语句来驱动每条输出线,也可以选择声明(四条)线用作中间信号,其中每条内部线由其中一个AND门的输出驱动。对于额外的练习,可以双管齐下。p1a p1b p1c的输入用与门连起来,p1d p1e p1f的输入用与门连起来,之后将两个的输出用或门连起来,再从p1y输出。看图片,p2a p2b用与门连起来,p2c p2d用与门连起来,两个的输出用或门连起来,值从p2y输出。7458是一款具有四个“与”门和两个“或”门的芯片。还是一样,看文字还是太复杂了,直接看图得了。原创 2023-05-27 15:36:47 · 258 阅读 · 1 评论 -
HDL—Verilog Language—Basics—Declaring wires
创建两条中间导线(根据需要命名),将AND和OR门连接在一起。请注意,提供NOT门的连线实际上是连线输出的,所以您不一定需要在这里声明第三条连线。题目描述说的很复杂,其实直接看图就可以了,把ab用与门连起来,cd用与门连起来,然后把两个的输出用或门连起来。输出的值就是一个是正的,一个是负的,用单目运算符~就可以了。原创 2023-05-27 15:28:06 · 36 阅读 · 1 评论 -
HDL—Verilog Language—Vectors—Vectors
构建一个有一个3位输入的电路,然后输出相同的矢量,并将其拆分为三个单独的1位输出。将输出o0连接到输入向量的位置0,将o1连接到位置1,等等。在图中,旁边有数字的勾号表示矢量(或“总线”)的宽度,而不是为矢量中的每个位画一条单独的线。注意,在输入声明类型的时候,有几位的标注是写在信号名前面的。也是很简单,就是一个语法的使用,把对应的脚连起来就可以。原创 2023-05-27 15:41:16 · 65 阅读 · 0 评论 -
HDL—Verilog Language—Basics—XNOR gate
也很简单,判断下ab是否相等就可以了。两个输入相同就输出1,不同就输出0。创建一个实现XNOR门的模块。原创 2023-05-27 15:21:53 · 224 阅读 · 0 评论 -
HDL—Verilog Language—Basics—NOR gate
创建一个实现NOR门的模块。NOR门是输出反相的OR门。在Verilog中编写NOR函数时,需要两个运算符。很贴心了,要两个运算符都告诉我了。实际上就是或门加一个非就可以了。NOR gate 就是或非门。原创 2023-05-27 15:18:25 · 118 阅读 · 1 评论 -
HDL—Verilog Language—Basics—AND gate
在verilog也不需要这么麻烦直接用运算符&就可以实现与门了。创建一个实现AND门的模块。AND gate 就是与门。原创 2023-05-26 19:51:58 · 78 阅读 · 1 评论 -
HDL—Verilog Language—Basics—Inverter
创建一个实现NOT门的模块。写一个非门,easy啊。原创 2023-05-26 19:47:03 · 96 阅读 · 1 评论 -
HDL—Verilog Language—Basics—Four wires
下图说明了电路的每个部分如何对应于Verilog代码的每个位。从模块外部看,有三个输入端口和四个输出端口。按照图片把对应输出输入assign起来就行。原创 2023-05-26 19:44:53 · 28 阅读 · 1 评论 -
HDL—Verilog Language—Basics—Simple wire
创建一个具有一个输入和一个输出的模块,其行为类似于导线。就连起来就行,前面都很简单啊,就是最基础的语法。原创 2023-05-26 19:41:14 · 68 阅读 · 1 评论 -
HALBits—Getting Started—Output Zero
构建一个没有输入、只有一个输出常量0的电路。也很简单,和前一个一样,拉低就行。原创 2023-05-26 19:36:15 · 54 阅读 · 1 评论