Verilog编程基础练习

Verilog编程基础练习

3—8译码器

理论学习

3-8译码器的输入信号共有3个,也就是可以输入8种不同的二进制编码,分别是000、001、010、011、100、101、110和111。对于每一种输入信号,3-8译码器都会产生对应的输出信号,输出信号共有8个,分别标识为Y0到Y7。

真值表

在这里插入图片描述

logisim仿真图

在这里插入图片描述

verilog编程仿真实现

根据功能分析,该工程只需实现一个3-8译码器的功能,所以设计一个模块即可。模块命名a38decoder,模块的输入为3个bit信号,输出为1个8bit信号,实现通过输入3个信号组成的二进制的8种情况来对应输出8bit的8种不同状态,根据上面分析可得出visio框图如图:

在这里插入图片描述
得出电路:
在这里插入图片描述
代码实现:

module a38decoder
(
input wire in1,
input wire in2,
input wire in3,
output reg [7:0] out
);

always@(*)
if({in1,in2,in3} == 3'b000)
   out = 8'b0000_0001;
else if({in1,in2,in3} == 3'b001)
   out = 8'b0000_0010;
else if({in1,in2,in3} == 3'b010)
   out = 8'b0000_0100;
else if({in1,in2,in3} == 3'b011)
   out = 8'b0000_1000;
	else if({in1,in2,in3} == 3'b100)
   out = 8'b0001_0000;
	else if({in1,in2,in3} == 3'b101)
   out = 8'b0010_0000;
	else if({in1,in2,in3} == 3'b110)
   out = 8'b0100_0000;
	else if({in1,in2,in3} == 3'b111)
   out = 8'b1000_0000;
	else
	out = 8'b0000_0001;
	
endmodule
分析

(1)代码生成的电路更为复杂,更为完整。
(2)不可以把reg换成wire。
从仿真分析角度来说wire对应于连续赋值,如assignreg对应于过程赋值,如always,initial。

全加器

一位全加器

logisim 实现

在这里插入图片描述

VERILOG实现

代码:

module Fulladder(
  input ain,bin,cin,
  output reg cout,sum
  
);
reg s1,s2,s3;
always @(ain or bin or cin) begin
  sum=(ain^bin)^cin;
  s1=ain&cin;
  s2=bin&cin;
  s3=ain&bin;
  cout=(s1|s2)|s3;
end 
endmodule

生成电路:
在这里插入图片描述
功能仿真:
在这里插入图片描述

四位全加器

logisim实现

在这里插入图片描述

verilog实现

代码:

module fourFulladder (
    num1,
    num2,
    cin,
    cout,
    sum
);

input   [3:0]   num1;
input   [3:0]   num2;
input           cin;
output          cout;
output  [3:0]   sum;


reg             cout;
reg     [3:0]   sum;
reg             add;

always @(num1 or num2 or cin)
begin
    // 第一位
    sum[0] = (num1[0] ^ num2[0]) ^ cin;
    cout = (num1[0] & num2[0]) | (num2[0] & cin) | (num1[0] & cin);
    add = cout;
    // 第二位
    sum[1] = (num1[1] ^ num2[1]) ^ add;
    cout = (num1[1] & num2[1]) | (num2[1] & add) | (num1[1] & add);
    add = cout;
    // 第三位
    sum[2] = (num1[2] ^ num2[2]) ^ add;
    cout = (num1[2] & num2[2]) | (num2[2] & add) | (num1[2] & add);
    add = cout;
    // 第四位
    sum[3] = (num1[3] ^ num2[3]) ^ add;
    cout = (num1[3] & num2[3]) | (num2[3] & add) | (num1[3] & add);
    add = cout;
end
endmodule



仿真实现:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值