代码拉取完成,页面将自动刷新
遇到的问题及解决:
(1)在设计sc指令过程中,看似sc和sw指令格式是一样的,但是sc要给rt赋1,这个在当时设计过程中在ID模块忽略了这个问题,并没有提供正确的regcWrite和regcAddr,导致仿真datamem[addr]<--rt和LLbit<--0没有问题,并没有给rt赋1,通过分析仿真结果,观察到ID传出来的结果并不是预期的,找到问题所在并修改。
(2)在实现mtlo和mthi的过程中忘记把whi和wlo这两个写信号在EX中设置为有效,导致结果没有写入LLbit。还有就是中断的优先级要比J型指令高,在IF模块就要放到J型之前判断,在设计的时候忽略了这个问题,导致仿真结果出现错误。
(3)下板的代码在Modelsim上仿真没有问题,在实验室Vivado 18.3下板的过程出现了报错,但是看不懂。下午想着在宿舍试试,最后是在自己电脑上安装了Vivado 19.1,就不出现报错了。流水灯一开始的下板结果并不是我预期的,检查发现代码的逻辑有问题。
(4)规定了相应的模块端口的命名,特别是在设计流水线的过程中,否则代码的整合会非常麻烦。
下板
Vivado2019.1/basys3
流水灯(16个灯)
流水灯添加数码管
basys3-----用程序控制
示例:开关1---4个数码管显示1234
开关2----4个数码管显示4321
上面的示例是一个静态的?
那流水灯---动态?怎么实现
(也就是数码管同时显示的问题)
解决方法:
老师说也可以用sword开发板(这个之前用过,比较熟悉)
sword开发板,有相应的并串转换模块,可以实现同时显示
basys3要是有就好了,害!
想到的两个解决方法:
1.用sword开发板
2.如果不用数码管同时显示的话,是不是也可以呢?
流水灯我用的是初值是1,然后左移,那么每次只有一个灯亮(4个灯对应一个数码管),那么也就是一个数码管亮(选通)
用一个always块来实现该功能(选通数码管),如下,低四个灯有灯亮(也就是代码中的led[3:0]>0)选通第一个数码管,其余都类似。
(这里就是有灯亮的时候数码管才亮,舍弃了0,如果led[3:0]>=0,当灯左移4位后,那就在这一个if语句里(大概就是这个意思),那就一直选通的这个数码管,显示0)
哦,分时复用!!!
分时复用意味着依次快速切换四个数码管的显示,利用人眼的视觉暂留效应,使其看起来像是同时亮起。为此,我需要添加一个计数器来控制切换的时机,通常每个数码管显示1ms左右,整个周期为4ms,刷新率约为250Hz。
修改数码管的选择逻辑。原代码中使用的是组合逻辑,根据led的值选择显示某个数码管。现在需要改为时序逻辑,通过计数器循环切换sel信号,依次激活每个数码管的阳极,并同步输出对应的段码。
此外,需要确保七段译码模块(shumaguan)的输出正确,可能需要调整段码的极性,因为原代码中的显示逻辑可能与实际硬件(共阳极或共阴极)有关联。
还需要注意时钟分频的问题。原代码中可能已经有时钟分频模块(如clk_div),需要确认分频后的时钟是否适合用于动态扫描。如果时钟频率过高,可能需要调整计数器的大小以获得合适的刷新率。
关于Basys3的外设相关内容,参考下面的博客
https://blog.csdn.net/wuyufei_sun/article/details/146713573?sharetype=blogdetail&sharerId=146713573&sharerefer=PC&sharesource=wuyufei_sun&spm=1011.2480.3001.8118
如何修改?
module SoC(
input wire clk0,
input wire rst,
/*IO interface*/
input wire [1:0] sel,
output reg [10:0] displayout, // 前4位控制AN,后7位控制段码
output wire [15:0] led
);
wire [6:0] out1, out2, out3, out4;
reg [19:0] cnt_refresh = 0; // 刷新计数器(假设50MHz时钟)
reg [1:0] sel_scan = 0; // 数码管动态扫描选择信号
// 七段译码模块实例化
shumaguan U1(out1, led[3:0]);
shumaguan U2(out2, led[7:4]);
shumaguan U3(out3, led[11:8]);
shumaguan U4(out4, led[15:12]);
// 分时复用控制逻辑
always @(posedge clk0) begin
if (rst) begin
cnt_refresh <= 0;
sel_scan <= 0;
end else begin
cnt_refresh <= cnt_refresh + 1;
if (cnt_refresh == 50_000) begin // 1ms刷新周期(50MHz时钟)
cnt_refresh <= 0;
sel_scan <= sel_scan + 1;
end
end
end
// 数码管动态扫描输出
always @(*) begin
case (sel_scan)
2'b00: displayout = {4'b1110, out1}; // 选中第1位数码管(AN0低电平)
2'b01: displayout = {4'b1101, out2}; // 选中第2位数码管(AN1低电平)
2'b10: displayout = {4'b1011, out3}; // 选中第3位数码管(AN2低电平)
2'b11: displayout = {4'b0111, out4}; // 选中第4位数码管(AN3低电平)
default: displayout = 11'b1111_1111111; // 默认关闭
endcase
end
// 其余原有代码保持不变(时钟分频、MIPS、内存等)
wire clk;
clk_div clk_div0(
.clk(clk0),
.rst(rst),
.Clk_CPU(clk)
);
// ...(其他模块实例化代码)
endmodule
原SoC部分代码(选中某一个数码管)
module SoC(
input wire clk0,
input wire rst,
/*IO interface*/
input wire [1:0] sel,
output reg[10:0] displayout,//
output wire[15:0] led
);
wire[6:0] out1;
wire[6:0] out2;
wire[6:0] out3;
wire[6:0] out4;
shumaguan U1(out1,led[3:0]); //7段译码
shumaguan U2(out2,led[7:4]);
shumaguan U3(out3,led[11:8]);
shumaguan U4(out4,led[15:12]);
always@(*)
begin
if(led[3:0]>0) displayout={4'b1110,out1};
else if(led[7:4]>0) displayout={4'b1101,out2};
else if(led[11:8]>0) displayout={4'b1011,out3};
else if(led[15:12]>0) displayout={4'b0111,out4};
end
有关数码管的约束文件
(这里的高4位对应的管脚,就是用来选通哪一个数码管)
set_property PACKAGE_PIN W4 [get_ports {displayout[10]}]
set_property PACKAGE_PIN V4 [get_ports {displayout[9]}]
set_property PACKAGE_PIN U4 [get_ports {displayout[8]}]
set_property PACKAGE_PIN U2 [get_ports {displayout[7]}]
set_property PACKAGE_PIN W7 [get_ports {displayout[6]}]
set_property PACKAGE_PIN W6 [get_ports {displayout[5]}]
set_property PACKAGE_PIN U8 [get_ports {displayout[4]}]
set_property PACKAGE_PIN V8 [get_ports {displayout[3]}]
set_property PACKAGE_PIN U5 [get_ports {displayout[2]}]
set_property PACKAGE_PIN V5 [get_ports {displayout[1]}]
set_property PACKAGE_PIN U7 [get_ports {displayout[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {displayout[9]}]
set_property IOSTANDARD LVCMOS33 [get_ports {displayout[8]}]
set_property IOSTANDARD LVCMOS33 [get_ports {displayout[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {displayout[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {displayout[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {displayout[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {displayout[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {displayout[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {displayout[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {displayout[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {displayout[10]}]
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。