首页 > 其他分享 >HDLBits练习Shift18 Verilog逻辑右移和算数右移的区别

HDLBits练习Shift18 Verilog逻辑右移和算数右移的区别

时间:2024-06-24 14:00:53浏览次数:14  
标签:右移 Shift18 right HDLBits shift load 63 input

算术右移时,移入的是移位寄存器中数字(本例中为 q[63])的符号位,而不是逻辑右移时的零。右移n位,即加入n位符号位。即若符号位为1,在左边补1;若符号位为0,就补0。

算术右移的另一种思路是,它假定被移位的数字是带符号的,并保留符号,因此算术右移是右移n位将带符号的数字除以 2 的n次幂。

算数左移和逻辑左移的结果并无差别。算​术左移和逻辑左移一样都是右边补0。

Build a 64-bit arithmetic shift register, with synchronous load. The shifter can shift both left and right, and by 1 or 8 bit positions, selected by amount.

An arithmetic right shift shifts in the sign bit of the number in the shift register (q[63] in this case) instead of zero as done by a logical right shift. Another way of thinking about an arithmetic right shift is that it assumes the number being shifted is signed and preserves the sign, so that arithmetic right shift divides a signed number by a power of two.

There is no difference between logical and arithmetic left shifts.

  • load: Loads shift register with data[63:0] instead of shifting.
  • ena: Chooses whether to shift.
  • amount: Chooses which direction and how much to shift.
    • 2'b00: shift left by 1 bit.
    • 2'b01: shift left by 8 bits.
    • 2'b10: shift right by 1 bit.
    • 2'b11: shift right by 8 bits.
  • q: The contents of the shifter.
module top_module(
    input clk,
    input load,
    input ena,
    input [1:0] amount,
    input [63:0] data,
    output reg [63:0] q); 
    always@(posedge clk)
        begin
            if(load)
                q<=data;
            else if(ena)
                begin
                    case(amount)
                        2'b00:q<={q[62:0],1'b0};
                        2'b01:q<={q[55:0],8'b0};
                        2'b10:q<={q[63],q[63:1]};
                        2'b11:q<={{8{q[63]}},q[63:8]};
                        default:q<=q;
                    endcase
                end
           end           
endmodule

补充:

或可以直接定义q为有符号数定义signed,可直接用移位符

module top_module(
    input clk,
    input load,
    input ena,
    input [1:0] amount,
    input [63:0] data,
    output reg signed [63:0] q); 
    always@(posedge clk)
        begin
            if(load)
                q<=data;
            else if(ena)
                begin
                    case(amount)
                        2'b00:q<=q<<1;
                        2'b01:q<=q<<8;
                        2'b10:q<=q>>>1;
                        2'b11:q<=q>>>8;
                        default:q<=q;
                    endcase
                end
           end           
endmodule

                    

标签:右移,Shift18,right,HDLBits,shift,load,63,input
From: https://blog.csdn.net/zcy000810/article/details/139919322

相关文章

  • 【ARMv8/ARMv9 硬件加速系列 2.2 -- ARM NEON 的加减乘除(左移右移)运算】
    文章目录NEON加减乘除NEON加减乘除下面代码是使用ARMv8汇编语言对向量寄存器v0-v31执行加、减、乘以及左移和右移操作的示例。ARMv8的SIMD指令集允许对向量寄存器中的多个数据进行并行操作。v0和v1加载数据,对它们进行加、减和乘,左移和右移操作。最后,我们会将结......
  • 左/右移模版
    //左闭右开fnreverse(s:&mutString,i:usize,j:usize){letmutp=unsafe{s.as_bytes_mut()};letmutj=j-1;letmuti=i;whilei<j{p.swap(i,j);i+=1;j-=1;}}//左移fnleft_rotate(s:......
  • HDLBits/状态机笔记
    `moduletop_module(inputclk,inputx,outputz);reg[2:0]s_cur;reg[2:0]s_nex;//传递状态always@(posedgeclk)begins_cur<=s_nex;end//确定下一状态always@()begincase(s_cur)3'b000:case(x)0:s_nex=3'b100;1:s_nex=3'b111;endcase3�......
  • 5.14二维数组——右移,平移,鞍点计算
    1.矩阵平移问题题目如下:给定一个 n×n 的整数矩阵。对任一给定的正整数 k<n,我们将矩阵的偶数列的元素整体向下依次平移1、……、k、1、……、k、……个位置,平移空出的位置用整数 x 补。你需要计算出结果矩阵的每一行元素的和。输入格式:输入第一行给出3个正整数:n(<100)......
  • HDLBits练习:Countbcd
    目录题目代码解法一解法二解法三题目题目链接:Countbcd题目让写一个四位的BCD计数器,可以等价看成0000~9999的计数器,进位规则和我们日常的十进制计数一样。代码解法一通过例化或者修改一位的十进制计数器实现有关ena信号的处理部分,其实是与clk信号无关的;但是,也可以根据clk......
  • [吾题有解] HDLBits : Exams/m2014 q6b
    本题是一道简单的FSM设计题,题中已经给出了状态转移图,只要求我们输出用于表示状态的3位2进制(y[3:1])中第2位(y[2])的次态,这里主要是记录实现该输出的两种思路,且这两种描述思路下的代码在综合时可能会得到两种不同的电路。首先是第一种只采用一条assign语句的描述方法:moduleto......
  • verilog语言学习-HDLBits
    基本逻辑:anda&b与同为1时输出1ora|b或有一个为1输出1xora^b异或ab不同时输出1nand!(a&b)与非notand a与b再取反nor~(a|b)或非a或b再取反xnora~^b同或ab相同时输出1anotba&(!b)a与非b......
  • pc鼠标左右移动
     constmovable=useRef<any>(null) consthandle=()=>{  letisDragging=false;  letstartX:any;  movable.current.addEventListener('mousedown',(e:any)=>{    isDragging=true;    startX=e.clientX-movable.c......
  • HDLbits 刷题 -- Vector4
    学习:        连接操作符允许将向量连接在一起形成一个更大的向量。但有时您希望将相同的内容多次连接在一起,这样做仍然很繁琐,例如assigna={b,b,b,b,b};。复制操作符允许重复一个向量并将它们连接在一起:        {num{vector}}  这是将向量复制了num次......
  • unity+c#小项目练习 左右移动和碰撞
    创建首先,我们在Hierarchy面板创建两个cube,将其命名为player和player1,将player1的Scale均改为10,两者都要挂载上Rigidbody哦,切记!!!两者相撞还是会飞出去,是因为什么呢?因为两者质量是1,将player1的质量调成10,会被player推动,但是不会撞飞。懂了吧,质量!!!ok,我们来看看代码,这个是在scri......