HDLBits(11)2.17

1|03 电路

1|13.1 组合逻辑

1|03.1.1 基础门

  • Ring or vibrate(静音)

若手机处于震动模式则振动(motor),否则打开铃声(Ringer)

assign ringer = ring&(~vibrate_mode); assign motor = ring&vibrate_mode;
  • Thermostat(恒温器)

定义一个可以根据需要打开和关闭加热器(heater)、空调(air conditioning)、鼓风机(blower fan)的电路

制热模式(mode = 1)

  天太冷(too_cold = 1)打开加热器,但不打开空调

制冷模式(mode = 0)

  天太热(too_hot = 1)打开空调,但不打开加热器

当空调或加热器打开时,均打开风扇;用户也可通过 fan_on = 1 在加热器和空调均关闭时打开风扇

module top_module ( input too_cold, input too_hot, input mode, input fan_on, output heater, output aircon, output fan ); assign heater = mode & too_cold ; assign aircon = (~mode) & too_hot ; assign fan = aircon | heater | fan_on ; endmodule
  • Popcount3(3-bit population count)

“人口计数”电路可以计算所输入向量中“1”的数量。构建一个输入为3位向量的人口计数电路

module top_module( input [2:0] in, output [1:0] out ); integer i; always @(*) begin out = 2'd0; //十进制 for(i=0;i<3;i=i+1) begin if(in[i]==1'b1) //二进制 out = out+2'd1; //十进制 else out=out; end end endmodule
  •  Gatesv(Gates and Vectors)

有一个四位的输入向量 [3:0] ,我们希望可以知道每个位(bit) 与其邻位的关系:

out_both:此输出向量的每个位都应指示相应的输入位及其左侧的邻位(较高的索引)是否都是“1” 。例如,out_both[2]应该表明in[2]和in[3]是否都为 1。由于in[3]左边没有邻位,所以我们不需要知道out_both[3] .

out_any:此输出向量的每个位应指示相应的输入位及其右侧的邻居是否为“1”。例如,out_any[2]应该指示in[2]或in[1]是否为 1。由于in[0]右侧没有邻居,因此答案很明显,因此我们不需要知道out_any[0 ] .

out_different:此输出向量的每个位都应指示相应的输入位是否与其左侧的邻居不同。例如,out_diff[2]应该指示in[2]是否与in[3]不同。对于这部分,将向量视为环绕,因此in[3]左侧的邻居是in[0]。

both 、any和different输出分别使用双输入 AND、OR 和 XOR 运算。使用向量,这可以在 3 个分配语句中完成

module top_module( input [3:0] in, output [2:0] out_both, output [3:1] out_any, output [3:0] out_different ); integer i; always @(*) begin for(i=0;i<3;i=i+1) begin out_both[i] = in[i]&in[i+1]; out_any[3-i] = in[3-i]|in[2-i]; out_different[i] = in[i]^in[i+1]; end end assign out_different[3] = in[3]^in[0]; endmodule
  • Gatesv100(Even longer vectors)

有一个 100 位的输入向量 [99:0]。我们想知道每个位与其邻位之间的一些关系:

out_both:此输出向量的每个位应指示相应的输入位及其左侧的邻位是否都为“1”。例如,out_both[98]应该表明in[98]和in[99]是否都是 1。由于in[99]左边没有邻居,答案很明显,所以我们不需要知道out_both[99 ] .


out_any:此输出向量的每个位应指示相应的输入位及其右侧的邻居是否为“1”。例如,out_any[2]应该指示in[2]或in[1]是否为 1。由于in[0]右侧没有邻居,因此不需要知道out_any[0] .


out_different:此输出向量的每个位都应指示相应的输入位是否与其左侧的邻位不同。例如:out_diff[98]应该指示in[98]是否与in[99]不同。对于这部分,将向量视为环绕,因此in[99]左侧的邻居是in[0]。

上题中使用for实现,这里给出使用assign实现的方法:

module top_module( input [99:0] in, output [98:0] out_both, output [99:1] out_any, output [99:0] out_different ); assign out_both = in[98:0] & in[99:1]; assign out_any = in[98:0] | in[99:1]; assign out_different = in ^ {in[0], in[99:1]}; endmodule

 


__EOF__

本文作者LhTian
本文链接https://www.cnblogs.com/LhTian/p/17123880.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   LhTian21  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示