找回密码
 注册
关于网站域名变更的通知
查看: 331|回复: 1
打印 上一主题 下一主题

LED显示移位,位拼运算

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-10-12 10:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

+ ^" T. p/ f, b' M
LED显示移位,位拼运算
1. 移位运算符
    移位运算符是双目运算符,将运算符左边的操作数左移或右移运算符右边的操作数指定的位数,用 0 来补充空闲位。如果右边操作数的值为 X Z,则移位结果为未知X   
   Verilog HDL 中有两种移位运算符: <<(左逻辑移)>>(右逻辑移)。
例程:
module Shift_led(clk,rst_n);
        input rst_n;
        input clk;
       
        reg [3:0]a;
        reg [3:0]b;
       
        always @(posedge clk or negedge rst_n)
        if(!rst_n) begin
                a = 1;
                b = 3;
        end
        else begin
                a <= (a<<1);
                b <= (b>>1);
        end
endmodule
//仿真代码
`timescale 1ns/1ns
`define clk_period 20
module Shift_led_tb;
        reg clk;
        reg rst_n;
       
        initial clk = 1;
        always #(`clk_period/2)clk = ~clk;
        initial begin
                rst_n = 0;
                #(`clk_period*5);
                rst_n = 1;
                #(`clk_period*20);
                $stop;       
        end
        Shift_led Shift_led(.clk(clk),.rst_n(rst_n));
endmodule
仿真波形图:
从仿真图,可以看出,每次 a 都向左边移动移位,后面补充 0,直到把逻辑1 溢出,后面就一直为 0 了。 每次 b 都向右边移动移位,前面补充 0,直到把逻辑 1 溢出,就一直为 0 了。
   
   备注:移位运算符的使用时,左移可以看成是乘以 2,右移可以看成是除以2。 所以移位运算符用在计算中,代替乘法和除法。
    2. 位拼运算符
    位拼运算符是将多个小的表达式合并形成一个大的表达式,用符号{}来实现多个表达式的连接运算,各个表达式之间用“,”隔开。
module Concatation(clk,rst_n,out);
        input clk;
        input rst_n;
       
        output reg [3:0]out;
       
        reg [1:0]a;
        reg [1:0]b;
       
        always @(posedge clk or negedge rst_n)
        if(!rst_n) begin
                a <= 2'b11;
                b <= 2'b01;
                out <= 4'b0011;
        end
        else begin
                a <= (a<<1);
                b <= (b<<1);
                out <= {a,b};
        end
endmodule
//`tb.v同移位   注意修改例化
仿真波形图为:
通过波形图,我们可以清晰的看到移位和位拼结合的效果
:用位拼"{ }"同样可以实现循环效果
例程:
if()
...
out <= 4'b0111;
...
else
...
out <= {out[0],out[3:1]};
...
//感兴趣的可以试一下,这里不做展示
    3.LED显示移位,位拼效果.
    下面我们通过例程说明
module Concatation(clk,rst_n,led);
        input clk;
        input rst_n;
       
        output [3:0]led;
       
        reg [3:0]out;
       
        reg [1:0]a;
        reg [1:0]b;
       
        always @(posedge clk or negedge rst_n)
        if(!rst_n) begin
                a <= 2'b11;
                b <= 2'b01;
                out <= 4'b0011;
        end
        else begin
                a <= (a<<1);
                b <= (b<<1);
                out <= {a,b};
        end
       
        assign led = out;
       
endmodule
///////////////////////////////////////////////////////
`timescale 1ns/1ns
`define clk_period 20
module Concatation_tb;
       
        reg clk;
        reg rst_n;
       
        initial clk = 1;
        always #(`clk_period/2)clk = ~clk;
       
        initial begin
                rst_n = 0;
                #(`clk_period*5);
                rst_n = 1;
                #(`clk_period*20);
                $stop;
               
        end
       
       
        Concatation Concatation(.clk(clk),.rst_n(rst_n),.led(led));
       
endmodule
仿真效果
我们通过观察ledout的输出,可以看到结果相同,通过led信号我们下载到板卡上时,就能观察到led显示同波形图

, I" l+ W, v5 e' ~" h/ b, g
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-23 12:11 , Processed in 0.140625 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表