题解|Verilog刷题解析及对应笔试面试注意点【1-5】(涉及复位、有符号数问题等)

在B站录制了试题讲解视频,更新题目解析文章本文更新了第1-5题
目的:不仅仅是解题,更多的是想从真实的FPGA和数字IC实习秋招和实际工程应用角度,解读一些【笔试面试】所注意的知识点,做了一些扩展
第一题——四选一选择器(三目运算符?:和case语句)
第二题——T触发器(异步复位和同步复位)
第三题——奇偶校验(实际上这个题应该是奇偶检测)
第四题——移位拼接乘法(有符号数和无符号数的乘法和除法)
第五题——位拆分
视频:
图片
图片
文章:
第一题——四选一选择器
1. 题目
四选一选择器。
2. 代码
2.1写法1——三目运算符?:
assign语句+三目运算符?:
2.2写法2——case语句
3. 解析
3.1三目运算符
三目运算符?:,使用方法:
其中,a、b、c均可以是表达式也可以是变量等,等效于if...else语句。
if...else只能在always语句描述中使用,所以有时候为了在描述组合逻辑时,一般就用?:来实现这种条件判断效果。
3.2 case语句
case的使用注意点:
(1)要在always块里使用,如果是用always块描述组合逻辑,注意括号里的敏感变量列表都是电平触发,并且赋值时都要用阻塞赋值“=”;
(2)always块里的变量必须声明成reg类型,当然声明成reg类型不代表一定会综合成寄存器,只是语法要求always块里要这样;
(3)always块描述组合逻辑时,用*可以代表所有always块内敏感信号;
分支条件要写全,最好补齐default缺省条件,不然在组合逻辑中可能会由于条件不全导致出现锁存器Latch
第二题——T触发器
1. 题目
用verilog实现两个串联的异步低电平复位的T触发器的逻辑。这个题目的重点是要关注异步低电平复位
2. 解析
2.1 T触发器
边沿T触发器:输入为1时下个时钟触发沿输出翻转;输入为时下个时钟触发沿输出保持。
边沿D触发器,输入为1时下个时钟触发沿输出为1,输入为时下个时钟触发沿输出为。
所以关于T触发器:
2.2 异步复位
异步复位,说明复位是异步的,和时钟触发边沿无关,复位信号一旦来临就使得寄存器进行复位操作,复位信号出现在always块的敏感列表里。
对于异步的低电平复位,以下降沿作为触发边沿(高电平变为低电平的时刻),并且触发后判断复位是否为低电平,即:
always @ (posedge clk ornegedge rst)
begin
if(~rst)
...;
else
...;
end
对于异步的高电平复位,以上升沿作为触发边沿(低电平变为高电平的时刻),并且触发后判断复位是否为高电平,即:
always @ (posedge clk orposedge rst)
begin
if(rst)
...;
else
...;
end
2.3 同步复位
同步复位时,复位与时钟触发沿有关,所以在always的敏感变量中,只有时钟触发边沿,然后根据高电平或者低电平再判断复位电平。
同步低电平复位:
always @ (posedge clk)
begin
if(~rst)
...;
else
...;
end
同步高电平复位:
always @ (posedge clk)
begin
if(rst)
...;
else
...;
end
2.4 同步复位和异步复位的优缺点
异步复位:反应快,复位电平可以小于一个时钟周期,有些触发器只有异步复位端口;
同步复位:稳定,不易受毛刺干扰,有些模块只有同步复位端口;
3. 代码
第三题——奇偶校验(奇偶检测)
1. 题目
用verilog实现对输入的32位数据进行奇偶校验,根据sel输出校验结果(sel=1输出奇校验,sel=输出偶校验)。
2. 解析
2.1 奇偶校验
通常所说的奇偶校验:
奇校验:对输入数据添加1位或者1,使得添加后的数包含奇数个1;
比如100,有奇数个1,那么奇校验结果就是,这样补完以后还是奇数个1;
奇校验:对输入数据添加1位或者1,使得添加后的数包含偶数个1;
回到这个题目,应该是出题人搞反了,按照出题的意思,应该不能叫奇偶校验,应该是叫奇偶检测
奇检测:输入的数据里有奇数个1就输出1;
偶检测:输入的数据里有偶数个1就输出1;
2.2 单目运算符
红框里的内容在视频讲解时有误,已更正。
单目运算符使用时,输入的数据的每一位进行运算,最后结果一定是1 bit的。
图片
用处:
3. 代码
第四题——移位拼接乘法
1. 题目
已知d为一个8位数,请在每个时钟周期分别输出该数乘1/3/7/8,并输出一个信号通知此时刻输入的d有效(d给出的信号的上升沿表示写入有效)。
2. 解析
2.1 移位运算实现乘法
图片
移位运算实现乘法和无符号除法
位拼接运算符实现拼接和复制
位拼接运算符实现乘法和除法