您的位置:首页 > 其它

Verilog HDL 典型组合逻辑电路设计

2017-12-03 15:27 447 查看

一.移位加三算法

1.将二进制数左移一位(未满 4 位在前面填 0)

2.如果移动了 8 位,那么二进制数就在 百位、十位和个位列,计算结束

3.在任何一个 BCD 列中,如果任何一个二进制数 大于或者等于 5,就把这个数 加上 3

4.回到步骤 1

module bin2bcd8
(
input wire [7:0] binary,
output wire [3:0] b,
output wire [3:0] c,
output wire [3:0] d
);

/*
z 作为存储 BCD 码和 二进制码的寄存器
如果输入为 8 位,那么 z 需要的长度为
0xFF = 255 ---> 10-0101-0101 +++ ????-????
总共 18 位
*/
reg [17:0] z;

always @ (*)
begin
z = 18'b0;                           //置 0
z[7:0] = binary;                     //读入低 8 位
repeat (8)                            //重复 8 次
begin
if(z[11:8 ]>4)                   //大于 4 就加 3
z[11:8 ] = z[11:8 ] + 2'b11;
if(z[15:12]>4)
z[15:12] = z[15:12] + 2'b11;
z[17:1] = z[16:0];               //左移一位
end
end
assign b = z[17:16];                     //输出 BCD 码
assign c = z[15:12];
assign d = z[11:8] ;

endmodule


二.2-4译码器

module decoder2_4( out, EN, in);
input EN;
input [1:0] in;
output [3:0] out;
reg [3:0] out;
always @(EN or in) begin
if (EN == 1)    // 使能信号有效
case (in)
2'b00 : out = 4'b0001;
2'b01 : out = 4'b0010;
2'b10 : out = 4'b0100;
2'b11 : out = 4'b1000;
endcase
else out = 4‘b0000; // 使能信号无效
end
endmodule


三.8421码译码器

module decoder_8421 ( Y, en, A);
input en;
input [3:0] A;
output [9:0] Y;
reg [9:0] Y;
always @(en or A) begin
if (en == 1)    // 使能信号有效
case (A)
4'b0000 : Y = 10'b0000000001;
4'b0001 : Y = 10'b0000000010;
4'b0010 : Y = 10'b0000000100;
4'b0011 : Y = 10'b0000001000;
4'b0100 : Y = 10'b0000010000;
4'b0101 : Y = 10'b0000100000;
4'b0110 : Y = 10'b0001000000;
4'b0111 : Y = 10'b0010000000;
4'b1000 : Y = 10'b0100000000;
4'b1001 : Y = 10'b1000000000;
default : Y = 10'b0000000000;
endcase
else out = 10'b0000000000; // 使能信号无效
end
endmodule


四.8421编码器

module Key_8421 ( Y, OUT, en, I);
input en;
input [9:0] I;
output [3:0] Y;
output OUT;
reg [9:0] Y;
reg OUT;
always @(en or I) begin
if (en == 1)    // 使能信号有效,开始编码
case (I)
10'b0000000001 : {OUT, Y} = 5'b10000;
10'b0000000010 : {OUT, Y} = 5'b10001;
10'b0000000100 : {OUT, Y} = 5'b10010;
10'b0000001000 : {OUT, Y} = 5'b10011;
10'b0000010000 : {OUT, Y} = 5'b10100;
10'b0000100000 : {OUT, Y} = 5'b10101;
10'b0001000000 : {OUT, Y} = 5'b10110;
10'b0010000000 : {OUT, Y} = 5'b10111;
10'b0100000000 : {OUT, Y} = 5'b11000;
10'b1000000000 : {OUT, Y} = 5'b11001;
default : {OUT, Y} = 5‘b00000;   // 使能信号有效,但输入无有效信号或有多位有效信号
endcase
else {OUT, Y} = 5‘b00000; // 使能信号无效,OUT = 0
end
endmodule


五.四位二进制转8421 BCD

module _4bitBIN2bcd ( BCD1, BCD0, Bin);
input [3:0] Bin;
ouput  reg [3:0] BCD1, BCD0;

always @(Bin) begin
{BCD1, BCD0} = 8'h00;
if (Bin < 10) begin
BCD1 = 4'h0;
BCD0 = Bin;
end
else begin
BCD1 = 4‘h1;   // 如果Bin ≥ 10,则十位部分为1
BCD0 = Bin – 4'd10;   // 各位部分等于Bin - 10
end
end
endmodule
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: